【逆元】

定义:对于正整数和,如果有,那么把这个同余方程中的最小正整数解叫做模的逆元。

如果m是素数且GCD(a,mod)== 1,我们就直接可以用费马小定理求了。即求:a^(m-2)% mod。

快速幂求即可。

#include<cstdio>
typedef long long LL;
const LL MOD=1e9+7;
LL fac[1000000+5];//阶乘 
LL inv[1000000+5];//逆元 
LL quickMod(LL a, LL b)//快速幂求逆元 
{
    LL ans=1;
    // a %= MOD;  
    while(b)
    {
        if(b&1) ans = ans * a % MOD;
        b>>=1;
        a = a*a % MOD;
    }
    return ans;
 } 
void getFac()
{
    fac[0] = inv[0] = 1;
    for(int i=1; i <= 1000000; i++)
    {
        fac[i]=fac[i-1]*i%MOD;// 阶乘打表 
        inv[i]=quickMod(fac[i],MOD-2);//快速幂求阶乘的逆元 
     } 
}
LL getC(LL a,LL b)//C(n,m) = n!/((n-m)!*m!) % (1e9+7)
{
    //if(b>a) return 0;
//  else 
    return fac[a] * inv[a-b] % MOD * inv[b] % MOD;
}
int main()
{
    getFac();
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        printf("%lld\n",getC((LL)n, (LL)m));
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值