【ZOJ 3609】Modular Inverse 最小乘法逆元

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

题解:
最小乘法逆元:由ax≡1 (mod m)得:转化为解线性方程ax+by=1
需要注意的地方:最小解取模时不能写成(x%t+t)%t 因为此题要的是正数解 这样写有时会输出0

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 typedef long long ll;
 8 ll exgcd(ll a,ll b,ll &x,ll &y)
 9 {
10     if(!b)
11     {
12         x=1;y=0;
13         return a;
14     }
15     ll r=exgcd(b,a%b,x,y);
16     ll t=x;
17     x=y;
18     y=t-a/b*y;
19     return r;
20 }
21 void work(ll a,ll b,ll c)
22 {
23     ll x,y;
24     ll r=exgcd(a,b,x,y);
25     if(c%r!=0){
26         printf("Not Exist\n");
27         return ;
28     }
29     x*=c/r;
30     ll t=b/r;
31     if(t<0)t=-t;
32     x%=t;
33     if(x<=0)x+=t;
34     printf("%lld\n",x);
35 }
36 int main()
37 {
38     int T;
39     ll a,b;
40     scanf("%d",&T);
41     while(T--){
42         scanf("%lld%lld",&a,&b);
43         work(a,b,1);
44     }
45     return 0;
46 } 

 

 
posted @ 2017-06-16 21:57  PIPIBoss  阅读(256)  评论(0编辑  收藏  举报