社区讨论

我想问一下我的思路错哪了呢?

P1641[SCOI2010] 生成字符串参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mjwbh6y0
此快照首次捕获于
2026/01/02 11:31
2 个月前
此快照最后确认于
2026/01/04 20:55
2 个月前
查看原帖
我的思路是:考虑m个1,m个0的方案数为C(2m,m)/(m+1),再考虑插入n-m个1,然后我得出了一个结论:这相当于只考虑原来0的个数,因为如果考虑1的个数会导致重复。比如110010,要还要插入2个1,相当于可以在画横线位置插入11_0_01_0_,由于一个位置可以插2个1,所以=C(5,2)=C(3+2,2)=C(n-m+m,n-m)=C(n,m),所以最终答案为C(2m,m)/(m+1)*C(n,m),但是交上去只有20pts,应该是n=m的分数,代码如下,求指点,谢谢!
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10,M=2e6,mod=20100403;
int n,m,fac[N],inv[N];
int qPow(int x,int y){
	int ans=1;
	while(y){
		if(y&1){
			ans=1ll*ans*x%mod;
		}
		y>>=1,x=1ll*x*x%mod;
	}
	return ans;
}
int C(int x,int y){
	return 1ll*fac[x]*inv[y]%mod*inv[x-y]%mod;
}
int main(){
	scanf("%d%d",&n,&m);
	fac[0]=1;
	for(int i=1;i<=M;++i){
		fac[i]=1ll*fac[i-1]*i%mod;
	}
	inv[M]=qPow(fac[M],mod-2)%mod;
	for(int i=M-1;i>=0;--i){
		inv[i]=1ll*inv[i+1]*(i+1)%mod;
	}
	printf("%lld",1ll*C(2*m,m)*qPow(m+1,mod-2)%mod*C(n,m)%mod);
}

回复

0 条回复,欢迎继续交流。

正在加载回复...