数论弱渣学习中,勿喷。。。。
百度百科
数论的题目中用到逆元的话主要就是乘法逆元了
一个小小的例子
在一连串的加减乘除中有 (a/b)%mod 这样的东东,直接除肯定会错,因为a已经是取模后的结果了
做法是这样的:
(a/b)%mod
let a=b*k
a%mod = b*k %mod
a/b%mod = k % mod;
=> k%mod <=> b*inverse(b) * k % mod
b * inverse(b) 与 1 同余
问题转换成a*inverse(b) % mod;
即求b对mod的乘法逆元
转换一下:
b*x%mod = 1;
b*x = y*mod + 1;
b*x - mod*y = 1;
这个式子其实就可以看出b 与 mod 应该互质
exgcd 解方程求最小正整数解即可
int exgcd(int a,int b,int &x,int &y) { if(b==0) {x=1;y=0;return a;} else { int d=exgcd(b,a%b,x,y); int t=x; x=y; y=t-a/b*y; return d; } } int inverse(int num,int mod) { int x,y; exgcd(num,mod,x,y); while(x<0) x+=mod,y-=num; return x; }
ps:下面的还没有详细去证明。。。。
其实如果P是质数的时候可以用费马小定理来做,即a*b^(mod-2)//这个比较常用
p不是质数的时候是
a*b^(phi(mod)-1)