[BZOJ 1856][SCOI 2010]字符串(组合数学)

题目链接

http://www.lydsy.com/JudgeOnline/problem.php?id=1856

思路

代码

扩欧写错了调了半天才发现,开小了阶乘数组RE一发,我是傻叉。。。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>

#define MOD 20100403

using namespace std;

typedef long long int LL;

LL fact[3100000];

LL extGCD(LL a,LL b,LL &x,LL &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    LL gcd=extGCD(b,a%b,x,y);
    LL t=x;
    x=y;
    y=t-(a/b)*y;
    return gcd;
}

LL rev(LL a,LL b) //求a在mod b意义下的逆元
{
    LL x, y;
    extGCD(a,b,x,y);
    return (x+b)%b;
}

LL C(LL n,LL m)
{
    return (fact[n]*rev(fact[n-m],MOD)%MOD)*rev(fact[m],MOD)%MOD;
}

int main()
{
    LL n,m;
    scanf("%lld%lld",&n,&m);
    fact[1]=1;
    for(LL i=2;i<3100000;i++) fact[i]=(fact[i-1]*i)%MOD;
    printf("%lld\n",((C(n+m,n)-C(n+m,m-1))%MOD+MOD)%MOD);
    return 0;
}

你可能感兴趣的:([BZOJ 1856][SCOI 2010]字符串(组合数学))