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 }

 

你可能感兴趣的:(GC)