Codeforces Round #779 (Div. 2)
阿新 • • 發佈:2022-04-15
觀察發現兩個0之間至少有2個1才能滿足題意
#include<bits/stdc++.h> using namespace std; #define lowbit(x) x&(-x) #define ll long long int T; vector<int>Q; int main(){ cin>>T; while(T--){ int n;string s; cin>>n; cin>>s; int ans=0;Q.clear(); for(int i=0;i<n;i++) if(s[i]=='0') Q.push_back(i); if(Q.size()==0){ cout<<0<<endl; continue; } for(int i=0;i<Q.size()-1;i++){ int l=Q[i],r=Q[i+1]; if((r-l-1)==0)ans+=2; else if((r-l-1)==1)ans+=1; } cout<<ans<<endl; } return 0; }
觀察發現 因為是連續的【1,n】所以 gcd只能是2
這樣奇數有 (n/2)! 個擺放方式 偶數也有(n/2)!個擺放方式
最後相乘
#include<bits/stdc++.h> using namespace std; #define lowbit(x) x&(-x) #define ll long long const int mod=998244353; int T; int main(){ cin>>T; while(T--){ int n;cin>>n; if(n&1){ cout<<0<<endl; continue; } else { ll ans=1; for(int i=1;i<=n/2;i++) ans=ans*i%mod; cout<<ans*ans%mod<<endl; } } return 0; }
首先我們能找到1 那個位置一定是最大的n 不妨先把n放在第一個位置
當我們依次在它前面插入一個數 c值要麼+1 要麼≤上一個插入的數c值
#include <bits/stdc++.h> using namespace std; void solve() { int n; cin >> n; vector<int> a(n); for(int i=0;i<n;i++)cin>>a[i]; if (count(a.begin(), a.end(), 1) != 1) { cout << "NO\n"; return; } int p = find(a.begin(), a.end(), 1) - a.begin(); rotate(a.begin(), a.begin() + p, a.end()); for (int i = 1; i < n; ++i) { if (a[i] - a[i - 1] > 1) { cout << "NO\n"; return; } } cout << "YES\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int t; cin >> t; while (t--) solve(); return 0; }