ZOJ 3609 求逆元

Modular Inverse

Time Limit: 2 Seconds       Memory Limit: 65536 KB

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

简单题,求逆元。 最小的x>0,满足ax==1 (mod m)

am都很小,不超过1000。所以可以暴力枚举x1开始枚举,

因为是对m取模的,所枚举x1m即可。另外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 }

 

你可能感兴趣的:(360)