首页 > 代码库 > ZOJ 3609 Modular Inverse(扩展欧几里德)
ZOJ 3609 Modular Inverse(扩展欧几里德)
题目链接: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
3 3 11 4 12 5 13
Sample Output
4 Not Exist 8
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(扩展欧几里德)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。