A/B 扩展gcd(或逆元)

                                A/B

题目抽象:给出n,B.  n=A%9973,gcd(B,9973)=1.     求(A/B)%9973.思路:A是未给出的量,需要用其他量来表示它。设A/B=x,即A=B*x;   y=A/9973.

n=A-A/9973*9973=B*x-9973*y=n;(**) 。

gcd(B,9973)=1=B*x1+9973*y1;(*)

将(*)左右两边乘以n    得到    B*(n*x1)-9973*(-n*y1)=n;只需求出x1就可以了

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 void ex_gcd(int a,int b,int &d,int &x,int &y)
 9 {
10       if(b==0)
11       {
12             x=1;y=0;d=a;
13       }
14       else
15       {
16             ex_gcd(b,a%b,d,y,x);
17             y-=(a/b)*x;
18       }
19 }
20 
21 int main()
22 {
23       int T,b,n;
24       int x,y,d;
25       scanf("%d",&T);
26       while(T--)
27       {
28             scanf("%d%d",&n,&b);
29             ex_gcd(b,9973,d,x,y);
30             x*=n;               //  x可能为负数
31             printf("%d\n",(x%9973+9973)%9973);
32       }
33       return 0;
34 }

 

知道逆元的同学就很容易发现这是一个赤裸裸得逆元问题。现在用逆元来水过。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 using namespace std;
 7 const int mod=9973;
 8 
 9 void ex_gcd(int a,int b,int &d,int &x,int &y)
10 {
11     if(b==0)
12     {
13         x=1;y=0;d=a;
14     }
15     else
16     {
17         ex_gcd(b,a%b,d,y,x);
18         y-=(a/b)*x;
19     }
20 }
21 
22 int main()
23 {
24     int T,n,b;
25     scanf("%d",&T);
26     while(T--)
27     {
28         scanf("%d%d",&n,&b);
29         int d,x,y;
30         ex_gcd(b,mod,d,x,y);
31         x=(x%mod+mod)%mod;   //  x可能为负数
32         printf("%d\n",n*x%mod);
33     }
34     return 0;
35 }

 

posted on 2015-05-07 22:55  hutaishi  阅读(264)  评论(0)    收藏  举报

导航