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
*/

时间: 2024-10-09 05:23:49

hdu 1576 A/B (扩展欧几里得)(还得再看看)的相关文章

HDU 1576 A/B(拓展欧几里得)

Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). Input 数据的第一行是一个T,表示有T组数据. 每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9). Output 对应每组数据输出(A/B)%9973. Sample Input 2 1000 53 87 123456789 Sample Output 7922 60

欧几里得和扩展欧几里得

别人总结的,很详细,http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 欧几里得算法,就是人们常说的辗转相除法,比较好理解,主要作用是求两个数最大公约数,最小公倍数也可方便的求出 1 int gcd(int a,int b) 2 { 3 return b==0?a:gcd(b,a%b); 4 } View Cod 扩展欧几里得就非常神奇了,主要作用是解不定方程, 即  a * x + b * y = c ,我们都知道

hdu 1576 扩展欧几里得

(A/B)%9973=K A/B=K+9973*X A=BK+9973*X*B A%9973=n; BK%9973=n; BK=n+9973*Y (K/n)*B+(-Y/n)*9973=GCD(B,9973)=1; 求出k/n,求出k 1 /* 2 扩展欧几里得 3 扩展欧几里德算法是用来在已知a, b求解一组x,y使得ax+by = Gcd(a, b) =d(解一定存在,根据数论中的相关定理) 4 */ 5 #include<cstdio> 6 #include<iostream>

扩展欧几里得 HDU 1576

题意;要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). 因为:A%9973=n; 所以:9973*y+n=A: 设:A/B=x;(可以整除) 所以:9973*y+n=B*x; 所以:B*x-9973*y=n; ①式 又因为:gcd(B,9973) = 1; 所以必存在 x1*B+9973*y1=1;②式 ②式*n=①式 所以只要求出x1,就可以得到x,又因为x=a/b,只要在 mod 9973就是答案了. 现

HDU 2669 (扩展欧几里得入门)

练习一下数学知识了.. [题目链接]click here~~ [题目大意]Find the nonnegative integer X and integer Y to satisfy X*a + Y*b = 1. If no such answer print "sorry" instead. 求满足式子的x和y否则输出"sorry" [解题思路]扩展欧几里得的基础了, 扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足 等式: ax+by = gcd

[ACM] hdu 3923 Invoker (Poyla计数,快速幂运算,扩展欧几里得或费马小定理)

Invoker Problem Description On of Vance's favourite hero is Invoker, Kael. As many people knows Kael can control the elements and combine them to invoke a powerful skill. Vance like Kael very much so he changes the map to make Kael more powerful. In

hdu 5512 Pagodas 扩展欧几里得推导+GCD

题目链接 题意:开始有a,b两点,之后可以按照a-b,a+b的方法生成[1,n]中没有的点,Yuwgna 为先手, Iaka后手.最后不能再生成点的一方输: (1 <= n <= 20000) T组数据T <= 500; 思路:由扩展欧几里得知道对于任意正整数,一定存在整数x,y使得 x*a + y*b = gcd(a,b);并且这个gcd是a,b组成的最小正整数:同时也知道了这也是两个点之间的最小距离: 之后直接求点的个数即可: ps:这道题我竟然想到了组合游戏..明显没有说双方都要用

[ACM] hdu 3923 Invoker (Poyla计数,高速幂运算,扩展欧几里得或费马小定理)

Invoker Problem Description On of Vance's favourite hero is Invoker, Kael. As many people knows Kael can control the elements and combine them to invoke a powerful skill. Vance like Kael very much so he changes the map to make Kael more powerful. In

HDU 4596 - Yet another end of the world(扩展欧几里得)

题意:给定一系列的虫洞,每个虫洞都有自己的x,y,z,当你的 id 对 x 取余后结果落在[ y,z ]区间内,则会被吸引,被两个或两个以上的虫洞吸引会有危险,求能否宇宙飞船能否起飞. 枚举每两个虫洞,有 id - k1 * x1 = u id - k2 * x2 = v 其中k1与k2分别为 id / x1 与 id / x2,u与v分别为求余后的结果. 两式相减得  k2 * x2 - k1 * x1 = u - v 根据扩展欧几里得,判断 u - v 的取值是否能取到 gcd(x1, x2