Codeforces Round #629 (Div. 3)
A. Divisibility Problem
签到题。
#include <bits/stdc++.h> using namespace std; typedef long long ll; void solve(){ ll a,b;cin>>a>>b; if(a%b==0) cout<<"0\n"; else cout<<b*(a/b+1)-a<<"\n"; } int main() { int t;cin>>t; while(t--) solve(); return 0; }
B. K-th Beautiful String
只移动第一个b后发现相邻两个名次之差为等差数列。
#include <bits/stdc++.h> using namespace std; void solve(){ int n,k;cin>>n>>k; int l=n-2; int sum=1,step=1; while(sum+step<=k){ sum+=step++; --l; } k-=sum; string s=string(n,'a'); s[l]=s[n-1-k]='b'; cout<<s<<"\n"; } int main() { int t;cin>>t; while(t--) solve(); return 0; }
C. Ternary XOR
出现分歧时较大者不再取数。
#include <bits/stdc++.h> using namespace std; void solve(){ int n;cin>>n; string s;cin>>s; string s1,s2; bool flag=true; for(char c:s){ if(c=='2'){ if(flag){ s1+='1'; s2+='1'; }else{ s1+='0'; s2+='2'; } }else if(c=='1'){ if(flag){ s1+='1'; s2+='0'; flag=false; }else{ s1+='0'; s2+='1'; } }else{ s1+='0'; s2+='0'; } } cout<<s1<<"\n"<<s2<<"\n"; } int main() { int t;cin>>t; while(t--) solve(); return 0; }
D. Carousel
分情况讨论。
#include <bits/stdc++.h> using namespace std; void solve(){ int n;cin>>n; int a[n];for(int &i:a) cin>>i; int res[n]={}; bool same=true; for(int i=1;i<n;i++) if(a[i]!=a[i-1]) same=false; if(same){ fill(res,res+n,1); }else if(n%2==0){ for(int i=0;i<n;i++) res[i]=(i&1?1:2); }else{ for(int i=0;i<n;i++){ if(a[i]==a[(i+1)%n]){ for(int j=i-1;j>=0;j--) res[j]=(j&1?1:2); for(int j=i+2;j<n;j++) res[j]=(j&1?2:1); res[i]=res[(i+1)%n]=(i&1?1:2); break; } } } if(res[0]==0){ res[0]=3; for(int i=1;i<n;i++) res[i]=(i&1?1:2); } cout<<*max_element(res,res+n)<<"\n"; for(int i=0;i<n;i++) cout<<res[i]<<" \n"[i==n-1]; } int main() { int t;cin>>t; while(t--) solve(); return 0; }