hdu 1576 A/B (扩展欧几里得)(还得再看看)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 1576 A/B (扩展欧几里得)(还得再看看)相关的知识,希望对你有一定的参考价值。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<queue>
 4 #include<string>
 5 #include<math.h>
 6 #include<stack>
 7 #include<cstdlib>
 8 #include<set>
 9 #include<map>
10 #include<cstring>
11 #include<vector>
12 #include<algorithm>
13 #include<cctype>
14 #include<sstream>
15 
16 const double PI = acos(-1.0);
17 typedef long long ll;
18 typedef long long LL;
19 const int MOD = 9973;
20 using namespace std; 
21 
22 // ax+by = gcd(a, b) = d  已知a,b. 解 x,y,d; 
23 // b = 0 时:  ax = gcd(a,0) = d;  --> d = a , x = 1 ,y = 0
24 void ext_gcd(ll a,ll b,ll &x,ll &y,ll &d){
25     if(!b){
26         d = a, x = 1 , y = 0;        
27     }else{
28         ext_gcd(b,a%b,y,x,d);    // y,x交换位置
29         y = y - x*(a/b);        // y = y - x*(a/b);
30     }
31 }
32 int main(){
33     // (k/n)B +(-y/n)*9973 = gcd(B,9973) = 1
34     // x=k/n  
35     ll n,b,T,x,y,tmp;  
36     scanf("%lld",&T);  
37     while(T--){  
38         scanf("%lld%lld",&n,&b);  
39         ext_gcd(b,MOD,x,y,tmp);  
40         x=(x%MOD+MOD)%MOD;  
41         printf("%d\n",(x*n)%MOD);  
42     }  
43     return 0;
44 }
45 /*
46 令(A/B)%9973=k
47 A/B = k + 9973x  
48 --> A = kB + 9973*x*B,
49 
50 A%9973 = n 
51 --->k*B%9973 = n
52 --->kB = n + 9973*y
53 
54 故(k/n)B +(-y/n)*9973 = gcd(B,9973) = 1
55 */

/*
令(A/B)%9973=k
A/B = k + 9973x
--> A = kB + 9973*x*B,

A%9973 = n
--->k*B%9973 = n
--->kB = n + 9973*y

故(k/n)B +(-y/n)*9973 = gcd(B,9973) = 1
*/

 

以上是关于hdu 1576 A/B (扩展欧几里得)(还得再看看)的主要内容,如果未能解决你的问题,请参考以下文章

HDU - 1576 A/B(扩展欧几里得算法)

hdu 1576 扩展欧几里得

HDU-1576 A/B (扩展欧几里得求逆元)

hdu1576A/B——扩展欧几里得算法

hdu1576 扩展欧几里德 A/B

hdu1576 A/B(扩展的欧几里德算法)