首页 > 编程语言 > 详细

大数组合数

时间:2018-01-27 14:51:48      阅读:255      评论:0      收藏:0      [点我收藏+]

 

使用前先build(),之后可以直接调用C()求组合数,其中涉及逆元知识,自行移步。

 

技术分享图片
const int SIZE = 2001;
LL fac[SIZE],inv[SIZE],p;
LL mypow(LL x,LL y){
    LL res=1;
    while(y){
        if(y&1)res=res*x%p;
        y>>=1;
        x=x*x%p;
    }
    return res;
}
LL C(int x,int y){
    if(y<0||y>x)return 0;
    return fac[x]*inv[y]%p*inv[x-y]%p;
}
void build()
{
    assert(p>=SIZE);
    fac[0]=1;
    for(int i=1;i<=SIZE;i++)
        fac[i]=fac[i-1]*i%p;
    inv[SIZE-1]=mypow(fac[SIZE-1],p-2);

    for(int i=SIZE-2;i>=0;i--)
        inv[i]=inv[i+1]*(i+1)%p;
}
void ADD(LL& x,LL v){
    x=(x+v)%p;
}
View Code

 

大数组合数

原文:https://www.cnblogs.com/wethura/p/8365612.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!