1. 程式人生 > 實用技巧 >JDOJ 2430: 組合數取模

JDOJ 2430: 組合數取模

JDOJ 2430: 組合數取模

題目傳送門

Description

Compute: N choose M mod 1000000007.

(0≤M≤N≤2×106)

Input

每個檔案有多組輸入資料,資料組數≤50

每組資料佔一行,分別是兩個正整數N,M

Output

每組測試資料輸出一個結果。

Sample Input

5 1 5 2 0 0

Sample Output

5 10 1


最優解宣告:


題解:

直接按組合數通項求,快速冪求逆元即可AC。

注意讀入。

#include<cstdio>
#define int long long
using namespace std;
const int maxn=2*1e6+10;
const int mod=1e9+7;
int n,m;
int fac[maxn];
int qpow(int a,int b)
{
    int ret=1;
    while(b)
    {
        if(b&1)
            ret=(ret*a)%mod;
        b>>=1;
        a=(a*a)%mod;
    }
    return ret%mod;
}
signed main()
{
    fac[0]=1;fac[1]=1;
    for(int i=2;i<=maxn;i++)
        fac[i]=(fac[i-1]*i)%mod;
    while(scanf("%lld%lld",&n,&m)!=EOF)
    {
        int ans=((fac[n]*qpow(fac[m],mod-2))%mod*qpow(fac[n-m],mod-2))%mod;
        printf("%lld\n",ans);
    }
    return 0;
}