ZOJ 3609 Modular Inverse(扩展欧几里德)

时间:2023-03-09 08:57:44
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-1x (mod
m)
. This is equivalent to ax≡1 (mod
m)
.

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

代码例如以下:

#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;
}