Codeforces Round #779 (Div. 2) A-C
time:Mar/27/2022
22:35UTC+8
A题:
化简题意知序列必须为0110110110......这样循环往复,所以要设置一个for循环,使得遇到第一个0不变,遇到两个连续的0会ans+=2,即可。
#include<bits/stdc++.h> using namespace std; typedef long long ll; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin>>t; while(t--){ int n; cin>>n; string s; cin>>s; int ans=0; int last=-10; for(int i=0;i<n;i++){ if(s[i]=='0'){ int diff=i-last-1; ans+=max(0,2-diff); last=i; } } cout<<ans<<endl; } return 0; }
B题:(规律题)
由样例和推理可知,求最大值则gcd必为2,那么就得有偶数个偶数分配到奇数上去,所以n&1时,cout<<"0"<<endl;然后观察n为偶数时,有n/2个奇数可以相互交换,不管顺序,有n/2个偶数可以相互交换,不换顺序,那么共有n个数时,ans=A(n/2,n/2)*A(n/2,n/2)%mod。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int mod=998244353; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin>>t; while(t--){ ll ans=1; int n; cin>>n; if(n&1){ cout<<"0"<<endl; } else{ for(int i=1;i<=(n/2);i++){ ans=(ans*i%mod*i)%mod; } cout<<ans<<endl; } } return 0; }
C题:(规律归纳题)
根据题目证明两个规律:n个数里面必然只有一个1,且从a[1]到a[n+1](a[n+1]=a[1])之间,a[i+1]-a[i]<=1。
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=3e5+3; int a[maxn]; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin>>t; while(t--){ int n; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; a[n+1]=a[1]; } int cnt=0,flag=1; for(int i=1;i<=n;i++){ if(a[i+1]>a[i]+1) flag=0; if(a[i]==1) cnt++; } if(cnt==1&&flag==1) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }

浙公网安备 33010602011771号