定义:对于正整数和,如果有,那么把这个同余方程中的最小正整数解叫做模的逆元。
如果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;
}
510

被折叠的 条评论
为什么被折叠?



