题目抽象:给出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 }