当计算结果很大时对mod=1e9+7取余,用到同余定理。求2的幂直接暴力求(当然也可以快速幂)
求组合数的时候用到除法,又要取余,所以用到逆元。所以用到逆元公式。
1.什么是逆元
当求解公式:(a/b)%m 时,因b可能会过大,会出现爆精度的情况,所以需变除法为乘法:
设c是b的逆元,则有b*c≡1(mod m);
则(a/b)%m = (a/b)*1%m = (a/b)*b*c%m = a*c(mod m);
即a/b的模等于 a*b的逆元 的模;
2.费马小定理求逆元
x^(mod-2)为x的逆元,所以 (a/b)%m = [a * (pow(b,mod-2)%mod)]% m;
但是mod=1e9+7,所以暴力求幂会超时,方法是用快速求幂法压缩时间.
//快速幂算法
long long fastpow(int a, unsigned int b)
{
long long int result = 1;
while(b != 0)
{
if(b & 1 == 1)
{
result *= a;
}
a *= a;
b >>= 1;
}
return result;
}
‘
//求逆元算法
long long inv(long long x, int mod)
{
return fastpow(x, mod-2);
}
原文地址:https://www.cnblogs.com/khche/p/12496780.html
时间: 2024-10-25 11:08:22