ZOJ 3609 Modular Inverse

ZOJ 3609

 1 #include <cstdio>
 2 #include <cmath>
 3 using namespace std;
 4 int ex_gcd(int a,int b,int &x,int &y)//solve x,y in a*x+b*y=ex_gcd(a,b,x,y)=gcd(a,b);
 5 {
 6     if(b==0)
 7     {
 8         x=1;
 9         y=0;
10         return a;
11     }
12     int ans=ex_gcd(b,a%b,x,y);
13     int tmp=x;
14     x=y;
15     y=tmp-a/b*y;
16     return ans;
17     //x = x0 + (b/gcd)*t
18     //y = y0 – (a/gcd)*t
19     //we can solve x,y in a*x+b*y=c <=> c%gcd(a,b)==0 
20 }
21 
22 int get(int a,int m)//get x in a*x=1(mod m)
23 {
24     int x,y;
25     int gcd=ex_gcd(a,m,x,y);
26     if(1%gcd!=0)
27         return -1;//error
28     x*=1/gcd;
29     m=abs(m);
30     int ans=x%m;
31     if(ans<=0)
32         ans+=m;
33     return ans;
34 }
35 
36 int main()
37 {
38     int a,b;
39     int t;
40     scanf("%d",&t);
41     while(t--)
42     {
43         scanf("%d%d",&a,&b);
44         int ans=get(a,b);
45         if(ans==-1)
46             printf("Not Exist\n");
47         else
48             printf("%d\n",ans);
49         // scanf("%d%d",&a,&b);
50         // int gcd=ex_gcd(a,b,x,y);
51         // printf("gcd(%d,%d)=%d\n",a,b,gcd);
52         // printf("x:%d,y:%d\n",x,y);
53         // printf("%d*%d+%d*%d=%d\n",a,x,b,y,gcd);    
54     }
55     
56     return 0;
57 }
View Code

 

posted @ 2017-01-16 19:30  BBBob  阅读(153)  评论(0编辑  收藏  举报