【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;
}

你可能感兴趣的:(【BZOJ 1856】 [Scoi2010]字符串)