求a关于m的乘法逆元
a x ≡ 1 (mod m) 等价于 ax+my=1
求x的最小正数(不能是0,我就WA在这里了)。
当m=1时,或者 gcd(a,m)!=1 时x不存在。
所以用扩展gcd就可以求了。
#include<cstdio> #define ll long long ll exgcd(ll a,ll b,ll &x,ll &y) { if(b==0) { x=1; y=0; return a; } ll r=exgcd(b,a%b,x,y); ll tmp=x; x=y; y=tmp-a/b*y; return r; } int main() { ll t,a,m,x,y; scanf("%lld",&t); while(t--) { int ok; scanf("%lld%lld",&a,&m); if (m==1) { ok=0; } else { ok=exgcd(a,m,x,y); } if (ok==1) { x=(x%m+m)%m; if (x==0) { x=m; } printf("%lld\n",x); } else { printf("Not Exist\n"); } } return 0; }
原文:http://www.cnblogs.com/flipped/p/5193777.html