1. 程式人生 > >大數組合數取模(逆元+打表)

大數組合數取模(逆元+打表)

這裡寫圖片描述
將階乘O(n)打表之後C(n,m)便可O(1)求出,除法取模用逆元解決
hdu5698瞬間移動

#include<bits/stdc++.h>
using namespace std;
const int maxn=200000;
const int p=1000000007;

int f[maxn+10];
void init(){//階乘
    f[0]=1;
    for(int i=1;i<=maxn;i++){
        f[i]=(long long)f[i-1]*i%p;
    }
}

int fast(int a,int n){
    if(n==0)return 1;
    if
(n%2)return (long long)a*fast(a,n-1)%p; int tmp=fast(a,n/2); return (long long)tmp*tmp%p; } int C(int n,int m){ if(n==m||m==0)return 1; return ((long long)f[n]*fast(f[m],p-2)%p)*fast(f[n-m],p-2)%p; } int main(){ init(); int n,m; while(~scanf("%d%d",&n,&m)){ printf
("%d\n",C(n+m-4,m-2)); } return 0; }