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)
.
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.
For each test case, output the smallest positive x. If such x doesn't exist, output "Not Exist".
3 3 11 4 12 5 13
4 Not Exist 8
简单题,求逆元。 最小的x>0,满足ax==1 (mod m)。
a和m都很小,不超过1000。所以可以暴力枚举x从1开始枚举,
因为是对m取模的,所枚举x从1到m即可。另外m有可能等于1,
所以直接判断a*x%m==1会错。改用(a*x-1)%m==0即可,
另外也可以不用乘法,从(a-1)开始每次加a就可以了,但这都无所谓。
还有,循环终止应该到m,而不是(m-1),本来到m的话ax==0 (mod m)肯定不对,
但还是因为有m=1的问题:0==1 (mod 1) 否则ax==1会无解错掉。
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 int gcd(int x,int y){ 6 int z; 7 while(y){ 8 z=y; 9 y=x%y; 10 x=z; 11 } 12 return x; 13 } 14 int main(){ 15 int t,a,m,i,ans; 16 scanf("%d",&t); 17 while(t--){ 18 scanf("%d%d",&a,&m); 19 ans=gcd(a,m); 20 if(ans>1) 21 printf("Not Exist\n"); 22 else{ 23 i=1; 24 while((a*i-1)%m!=0) //这一步判断很重要 25 i++; 26 printf("%d\n",i); 27 } 28 } 29 return 0; 30 }