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.
OutputFor each test case, output the smallest positive x. If such x doesn't exist, output "Not Exist".
Sample Input3 3 11 4 12 5 13Sample Output
4 Not Exist 8
References
#include<bits/stdc++.h> using namespace std; typedef long long ll; /* 真的太阴了,还是自己的惯性,太强,包括自己对于逆元不是很熟 所以导致直接就是很蒙 竟然1的时候,可以两边同时mod,服了 */ int main() { ios::sync_with_stdio(false); int T; cin>>T; while(T--){ ll a,m,ans; cin>>a>>m; int flag=0; for(ll i=1;i<=m;i++){ if((a*i)%m==1%m){ flag=1; ans=i; break; } } if(flag) cout<<ans<<endl; else cout<<"Not Exist"<<endl; } return 0; }
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll exgcd(ll a,ll b,ll& d,ll& x,ll&y){ if(!b){ d=a;x=1;y=0; } else{ exgcd(b,a%b,d,y,x); y-=x*(a/b); } } /* 要是开这个关流的,就不要用scanf了,要不然会wa */ int main() { ios::sync_with_stdio(false); int T; cin>>T; while(T--){ ll a,m; cin>>a>>m; if(m==1){ cout<<"1"<<endl; continue; } ll x,y,gcd; exgcd(a,m,gcd,x,y); if(gcd!=1){ cout<<"Not Exist"<<endl; continue; } if(x<=0){ x=(x%m+m)%m; } cout<<x<<endl; } return 0; }