【BZOJ 1856】 [Scoi2010]字符串

题解大多网上有
给链接 http://blog.csdn.net/wzq_qwq/article/details/48706151

重点是 如何计算 这个组合数!

这里用到了 逆元 欧拉定理! 自行Google

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define MO 20100403
#define LL long long
LL n,m;
LL j[2000000+1],tot=0;
LL Inv(LL x,LL y)
{
	LL ans=1;
	while(y)
	{
		if(y&1) ans=(ans*x)%MO;
		x=(x*x)%MO;
		y>>=1;
	}
	return ans;
}
LL F(LL x,LL y)
{
	return ((j[x]*Inv(j[y],MO-2))%MO*Inv(j[x-y],MO-2))%MO;
}
int main()
{
	j[1]=1;
	for(LL i=2;i<=2000000;i++) j[i]=(j[i-1]*i)%MO;
	scanf("%lld %lld",&n,&m);
	printf("%lld",(F(n+m,n)-F(n+m,m-1)+MO)%MO);
	return 0;
}

posted @ 2016-01-11 15:28  sxb_201  阅读(258)  评论(3编辑  收藏  举报