int64 x当 x*x可能溢出int64时需要内部取模 (x%mod)*(x%mod)%mod
当出现求解(b/a)%mod=?问题时,可以转化到求解b*x%mod=?
其中x称为a关于mod的乘法逆元
1.笔算求a关于mod的乘法逆元x:
根据定义可知, a*x%mod=1 -> a*x=1+y*mod -> x=(mod+1)/b (:y=1) ;
HDU6304 Chiaki Sequence Revisited 等差数列 乘法逆元
2.拓展欧几里得求a关于mod的乘法逆元x (任意情况)
long long ex_gcd(long long a,long long b,long long &x,long long &y)
{
if(a==0&&b==0) return -1;
if(b==0){x=1;y=0;return a;}
long long d=ex_gcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
long long inv(long long a,long long n)
{
long long x,y;
long long d=ex_gcd(a,n,x,y);
if(d==1) return (x%n+n)%n;
else return -1;
}
3.费马小定理求a关于mod的乘法逆元x (a<mod,a\mod互质)
long long inv_(long long a,long long m)
{
if(a==1) return 1;
return inv_(m%a,m)*(m-m/a)%m;
}
4.利用欧拉函数求逆元(mod为素数,且a\mod互质)
long long inv_(long long a,long long mod)
{
return pow(a,mod-2,mod);
}
5.线性求1~MAX的逆元(MAX<mod即可)(费马小)
void inv_()
{
inv[0]=inv[1]=1;
for(int i=2;i<MAX;++i) inv[i]=((MOD-MOD/i)*inv[MOD%i])%MOD;
}
6.处理阶乘的逆元
逆元是完全积性函数,可由3,4,递推