原题传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1576
A/B
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1929 Accepted Submission(s): 1421
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)。
每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。
Output
对应每组数据输出(A/B)%9973。
Sample Input
2
1000 53
87 123456789
Sample Output
7922
6060
Author
xhd
Source
Recommend
/** 方法一: A = n+9973k; (k为大于等于0的正整数) 令x = A/B;则A = B*x; => B*x = n+9973k; => B*x - 9973k = n; 再由方程B*x1 + 9973y1 = gcd(B,9973); 如果能解出x1,那么x = nx1; k取-ny1的时候, 方程B*x - 9973k = n 成立; 现在的问题是怎么解出x1? 当然是扩展欧几里德算法啊! 题目中gcd(B,9973) = 1; 对于方程Bx1 + 9973y1 = 1; */ #include<cstdio> #define MOD 9973 int n,B; int t,x,y,d; void ex_gcd(int a,int b,int &d,int &x,int &y) { if(b==0){d = a;x=1;y=0;} else{ ex_gcd(b,a%b,d,y,x); y = y-(a/b)*x; } } int main() { scanf("%d",&t); while(t--) { d = 1; scanf("%d%d",&n,&B); ex_gcd(B,MOD,d,x,y); x = n*x; printf("%d\n",(x%MOD+9973)%MOD); } return 0; } /** 方法二: A = n+9973k; (k为大于等于0的正整数) 令C = A/B; C = t*9973 + x;这里x为所求(A/B)%9973; 则A = B*C = B*t*9973 + B*x ; =>n+9973k = 9973Bt +Bx; =>9973k = 9973Bt + (Bx - n); 所以(Bx - n)%9973 = 0; 应为x<9973;枚举就可以解决 */ #include<cstdio> #define MOD 9973 long long n,B; int t,x; int main() { scanf("%d",&t); while(t--) { x = 0; scanf("%I64d%I64d",&n,&B); while((B*x-n)%9973 != 0) { x++; } printf("%d\n",x); } return 0; }