扩展欧几里得-逆元 浙江2012年省赛J题 Modular Inverse
Time Limit: 2000MS | Memory Limit: 65535KB | 64bit IO Format: |
Description
The modular modular multiplicative inverse of an integer
a modulo
m is an integer
x such that
a-1≡x (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.
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
Hint
无
Source
浙江2012年省赛J题
(a*x)%m=1 扩展欧几里得求ax+my=1 x>0的最小整数解
#include<iostream>
#include<cstdio>
using namespace std;
#define ll __int64
ll x, y;
ll exgcd(ll a, ll b){
if(b == 0){
x = 1;
y = 0;
return a;
}
ll d = exgcd(b, a%b);
ll t = x;
x = y;
y = t-a/b*y;
return d;
}
int main(){
ll a, b, T;
scanf("%I64d",&T);
while(T--){
scanf("%I64d%I64d",&a,&b);
if(b==1){
printf("1\n");
continue;
}
//cout<<a<<b<<endl;
//ll g = 0;
ll g = exgcd(a, b);
if(g == 1){
while(x < 0){
x += b;
y -= a;
}
printf("%I64d\n",x);
}
else
printf("Not Exist\n");
}
return 0;
}