一、快速幂
int quickpow(int a,int n)
{
int ans = 1;
while(n)
{
if(n&1)
ans=ans*a%mod;
a=a*a%mod;
n>>=1;
}
return ans;
}
通过底数不断平方,指数不断进行位运算>>1,最后变成ans1,达到节省复杂度的效果。
二、乘法逆元
这里就不得要提每个人刚学数论都要遇到的费马小定理了。
将左边变成ap-2*a,显然,ap-2就是a的逆元了。
注意:涉及除法取模运算的时候,(A/B)mod C,直接(A mod C)/ (B mod C)是错误的;应该要先将B转换成其逆元b=1/B,之后求出(A*b)modC即可;
三、加上组合数的运用
上代码
int fac[MAXN];
int c(int n,int m){
fac[0] = 1;
for(int i=1;i<=n;i++) fac[i] = fac[i-1] * i % mod; //注意不能少mod
return fac[n] * quickpow(fac[m],mod-2) % mod * quickpow(fac[n-m],mod-2) % mod;
}