乘法逆元的定义
若ax≡1%p, 则称a关于模p的乘法逆元为x。
当a与p互质时,a关于模p的乘法逆元有解。如果不互质,则无解。如果p为质数,则从1到p-1的任意数都与p互质,即在1到p-1之间都恰好有一个关于模p的乘法逆元。且1到p-1中的所有数的逆元对应1到p-1中的所有数,既是单射也是满射。
逆元的求解
1.费马小定理
感觉很顺手的求法
当n为质数时,已知n^(p−1)≡1%p(费马小定理)
那么inv[n]=n^(p−2)%p.
那么inv[n]=n^(p−2)%p.
时间复杂度为O(logn)(快速幂).
LL quick(LL n,LL p) { LL res=1,ex=p-2; for(LL i=ex;i;i>>=1,n=n*n%p) { if(i&1) res=res*n%p; } return res; } int main() { LL n; while(cin>>n>>p) { cout<<quick(n,p)<<endl; } }
2.扩展欧几里得
这个方法没啥好讲,复杂度同样O(logn)
void exgcd(LL a,LL b,LL &g,LL &x,LL &y) { if(!b) g=a,x=1,y=0; else exgcd(b,a%b,g,y,x),y-=x*(a/b); } LL inv(LL num) { LL g,x,y; exgcd(num,MOD,g,x,y); return (x%MOD+MOD)%MOD; }
emmm,先这样吧,还有好多好多,慢慢来吧- -