比赛链接:https://atcoder.jp/contests/abc161/tasks
AtCoder Beginner Contest 161
第一次打AtCoder的比赛,因为是日本的网站终于不用倒时差了233。
A - ABC Swap
可以直接按照交换后的顺序输出。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> using namespace std; int main() { int a,b,c; cin>>a>>b>>c; cout<<c<<' '<<a<<' '<<b; return 0; }
B - Popular Vote
最后一个测试点会卡取下整的误差,可以通过变换不等式来避免。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> using namespace std; int main() { int n,m;cin>>n>>m; int a[n];for(int &i:a) cin>>i; int sum=accumulate(a,a+n,0); int cnt=0; for(int i:a) if(4*m*i>=sum) ++cnt; cout<<(cnt>=m?"Yes":"No")<<" "; return 0; }
C - Replacing Integer
$N$ 通过不断地减 $K$ 最后一定会在 $[0,K)$ 之内,此时输出 $min(N,K-N)$ 即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> using namespace std; int main() { long long n,k;cin>>n>>k; cout<<min(n%k,k-n%k); return 0; }
D - Lunlun Number
对每个数的最后一位从小到大进行扩展,操作 $k$ 次即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> using namespace std; int main() { long long k;cin>>k; queue<long long> q; for(long long i=1;i<=9;i++) q.push(i); long long ans; while(k--){ ans=q.front(); q.pop(); long long m=ans%10; if(m>0) q.push(ans*10+m-1); q.push(ans*10+m); if(m<9) q.push(ans*10+m+1); } cout<<ans; return 0; }
E - Yutori
思路参考自:Harris-H
正反向模拟一遍分别存储第 $i$ 次工作的最早和最晚天数,若二者相等说明该天必须工作。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> using namespace std; int main() { int n,k,c;cin>>n>>k>>c; string s;cin>>s; int a[k]={},b[k]={}; for(int i=0,j=0;i<n&&j<k;i++) if(s[i]=='o') a[j++]=i,i+=c; for(int i=n-1,j=k-1;i>=0&&j>=0;i--) if(s[i]=='o') b[j--]=i,i-=c; for(int i=0;i<k;i++) if(a[i]==b[i]) cout<<a[i]+1<<" "; return 0; }
F - Division or Substraction
若 $N$ 最终可以变为 $1$,$K$ 需要满足:$frac{N}{K^n}$${\%K=1}$。
- 当 $n=0$ 时,$N\%K=1$,此时的 $K$ 为 $N-1$ 的因子。
- 当 $n>0$ 时,只有枚举不大于 $sqrt{N}$ 的因子K,才有可能得到 $frac{N}{K^n}$${\%K=1}$。
最后再讨论一下 $K=1$ 和 $K=N$ 的情况即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ll n;cin>>n; set<ll> st; for(ll i=2;i*i<=n;i++){ if(n%i==0){ ll t=n; while(t%i==0) t/=i; if(t%i==1) st.insert(i); } } for(ll i=1;i*i<=n-1;i++){ if((n-1)%i==0){ st.insert(i); st.insert((n-1)/i); } } st.erase(1); st.insert(n); cout<<st.size()<<" "; return 0; }