排列组合 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;
}
posted @ 2025-10-14 15:18  BaiBaiShaFeng  阅读(9)  评论(0)    收藏  举报
Sakana Widget右下角定位