The modular modular multiplicative inverse of an integer a modulo m is an integer xsuch 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.
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
今晚实在是想吐槽一下这个题,很无奈啊,本来想四题签到跑路,被这个题卡了2个小时,首先暴力枚举得没过,然后翻板子在拓展欧几里的找到了类似得题目,把板子搞上,疯狂wa,wa到自闭,结果是一组m为1时的特例为1,程序输出为0,还是太菜了,真************(疯狂喷自己)
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<map>
#include<cmath>
const int maxn=1e5+5;
typedef long long ll;
using namespace std;
int extend_gcd(int a,int b,int &x,int &y)
{
if(a==0&&b==0)
{
return -1;
}
if(b==0)
{
x=1;y=0;
return a;
}
int d=extend_gcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int mod_reverse(int a,int n)
{
int x,y;
int d=extend_gcd(a,n,x,y);
if(d==1)return(x%n+n)%n;
else return -1;
}
int main()
{
int T;
cin>>T;
while(T--)
{
int a,n;
cin>>a>>n;
if(n==1)
{
cout<<1<<endl;
continue;
}
if(__gcd(a,n)!=1)
{
cout<<"Not Exist"<<endl;
continue;
}
cout<<mod_reverse(a,n)<<endl;
}
return 0;
}