排列组合 CF1545B AquaMoon and Chess
我们观察到移动中 11 这样的结构是一直贴在一起的,而孤立的 1 是随着 11 的移动而移动的,所以我们仅仅需要在乎 0 和 11 的组合情况。
发现任意的 11 和 0 都是可以互换的,所以直接 \(\binom{cnt11+cnt0}{cnt0}\)
代码↓
点击查看代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod=998244353;
const int MN=1e6+116;
int quick_power(int a, int b){
int res=1; a%=mod;
while(b){
if(b&1) res=(res*a)%mod;
a=(a*a)%mod; b>>=1;
}
return res;
}
int inv(int x){
return quick_power(x,mod-2);
}
int fac[MN], a[MN];
int C(int n, int m){
if(n<0||m<0||n<m) return 0;
return ((fac[n]*inv(fac[m])%mod)*inv(fac[n-m]))%mod;
}
signed main(){
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
fac[0]=1; for(int i=1; i<MN; ++i) fac[i]=(fac[i-1]*i)%mod;
int T; cin>>T; while(T--){
string s; int cnt11=0, cnt0=0, n;
cin>>n>>s; s=' '+s;
for(int i=1; i<=n; ++i) a[i]=s[i]-'0';
for(int i=1; i<=n; ++i){
if(a[i]==1&&a[i+1]==1){
cnt11++; i++;
}else if(a[i]==0){
cnt0++;
}
}
cout<<C(cnt11+cnt0,cnt11)<<'\n';
}
return 0;
}

浙公网安备 33010602011771号