大數組合數
阿新 • • 發佈:2018-01-27
aps display col int view none nbsp i++ 組合數
使用前先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; }View Codevoid 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; }
大數組合數