標籤:exgcd gcd 擴充
題目連結:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4712
The modular modular multiplicative inverse of an integer a modulo m is an integer x such that a-1≡x (modm). This is equivalent to ax≡1 (modm).
Input
There are multiple test cases. The first line of input is an integer T ≈ 2000 indicating the number of test cases.
Each test case contains two integers 0 < a ≤ 1000 and 0 < m ≤ 1000.
Output
For each test case, output the smallest positive x. If such x doesn‘t exist, output "Not Exist".
Sample Input
33 114 125 13
Sample Output
4Not Exist8
References
- http://en.wikipedia.org/wiki/Modular_inverse
代碼如下:
#include <cstdio>#include <cstring>#include <cmath>typedef long long LL;LL exgcd(LL a,LL b,LL &x,LL &y){ if(b == 0) { x = 1; y = 0; return a; } else { LL r = exgcd(b,a%b,x,y); LL t = x; x = y; y = t-a/b*y; return r; }}LL cal(LL a, LL b, LL c){ LL x, y; LL tt = exgcd(a, b, x, y); if(c%tt)//無整數解 { return -1; } x*=c/tt; b/=tt; if(b<0) b=-b; LL ans=x%b; if(ans<=0) ans+=b; return ans;}int main(){ LL a, b, t; scanf("%lld",&t); while(t--) { scanf("%lld%lld",&a,&b); LL ans = cal(a, b, 1); if(ans == -1) { printf("Not Exist\n"); continue; } printf("%lld\n",ans); } return 0;}
ZOJ 3609 Modular Inverse(擴充歐幾裡德)