逆元是一个很有用的东西,还记得上半年不会逆元丢了许多许多分,最近算是恶补了一下,许多题都能AC了.
它的作用是处理膜意义下的除法运算,因为膜的时候对除数取余是错误的,这个时候就要用到逆元.
一.log2(mod)求mod为质数时任何数 的逆元
long long mul(long long x,long long y)//快速乘 { return ((x*y-(long long)(((long double)x*y+0.5)/mod)*mod)%mod+mod)%mod; } long long quick(long long a,long long b) { long long ans=1; for(;b;b>>=1,a=a*a%mod)//如果mod*mod溢出long long了就用快速乘 if(b&1)ans=ans*a%mod; return ans%mod; } long long niyuan(a) { return quick(a,mod-2); }
二.递推1到n的逆元
iniyuan[1]=1; for(i=2;i<=n;i++) iniyuan[i]=(mod-mod/i)*iniyuan[mod%i]%mod;
三.递推!1到!n的逆元(主要用于O(1)处理组合数)
iniyuan[1]=niyuan[1]=1;; for(i=2;i<=n;i++) iniyuan[i]=(mod-mod/i)*iniyuan[mod%i]%mod; for( i=2;i<=n;i++) niyuan[i]=niyuan[i-1]*iniyuan[i]%mod;