CF1546D.AquaMoon and Chess(組合數學)
阿新 • • 發佈:2021-07-12
思路:
考慮簡單的情況\(0001100\)
這樣移動後有\(0011000\)和\(0000110\)情況,可以發現\(11\)始終是在一起的,也就是說他們的移動位置可以看成是把\(1\)放到\(0\)上。
對於連續的多個\(1\)來說,有效的移動是成對的\(11\),單獨多出來的那個是無法移動的。
問題就傳化成了有\(cnt0\)個\(0\),\(cnt1\)個\(11\),有幾種方案數。
\(c[cnt0+cnt1][cnt0]\)
程式碼:
#pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll, ll>PLL; typedef pair<int, int>PII; typedef pair<double, double>PDD; #define I_int ll inline ll read() { ll x = 0, f = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-')f = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); } return x * f; } #define read read() #define closeSync ios::sync_with_stdio(0);cin.tie(0);cout.tie(0) #define multiCase int T;cin>>T;for(int t=1;t<=T;t++) #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i<(b);i++) #define per(i,a,b) for(int i=(a);i>=(b);i--) #define perr(i,a,b) for(int i=(a);i>(b);i--) const int inf = 0x3f3f3f3f; #define PI acos(-1) const int maxn=2e5+100; const int N = 300010; const int mod = 998244353; ll fact[N];//階乘 ll infact[N];//逆元 ll ksm(ll a,ll b,ll p){ ll res=1; while(b){ //&運算當相應位上的數都是1時,該位取1,否則該為0。 if(b&1) res=1ll*res*a%p;//轉換為ll型 a=1ll*a*a%p; b>>=1;//十進位制下每除10整數位就退一位 } return res; } void init(){ fact[0]=1; infact[0]=1; fact[1]=infact[1]=1; for(int i=2;i<2e5;i++){ fact[i]=fact[i-1]*i%mod; infact[i]=infact[i-1]*ksm(i,mod-2,mod)%mod; } } ll cul(ll a,ll b){ return fact[a]%mod*infact[b]%mod*infact[a-b]%mod; } void solve(){ string s; ll n=read;cin>>s; ll cnt0=0,cnt1=0,tmp=0; rep(i,0,n-1){ if(s[i]=='1') tmp++; else cnt0++,cnt1+=tmp/2,tmp=0; } cnt1+=tmp/2; printf("%lld\n",cul(cnt0+cnt1,cnt0)); } int main(){ init(); int _=read; while(_--){ solve(); } return 0; } /* 10001111110110111000 */