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): 3351 Accepted Submission(s):
2545
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
分析:
要求x = (A/B)%9973 = ?
原式可转化为 A/B = 9973 * b + x
<==> A = 9973B * b + x * B
由题意知n = A%9973,则A = 9973 * a + n
将A带进式子中得:
9973 * a + n = 9973B * b + x * B
<==> Bx + 9973(B*b - a) = n
令y = B * b - a 则:
<==>Bx + 9973y = n
要求x,这就可以用扩展欧几里德算法来求了
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> using namespace std; typedef long long ll; ll r; void gcd(ll a, ll b, ll &x, ll &y) { if(b == 0) { x = 1; y = 0; r = a; return ; } gcd(b, a % b, x, y); ll t; t = x; x = y; y = t - a / b * y; } int main() { int t; ll n, B, a, b, c, x, y; scanf("%d", &t); while(t--) { scanf("%lld %lld", &n, &B); a = B; b = 9973; c = n; gcd(a, b, x, y); ll s = b / r; x = c / r * x; x = (x % s + s) % s; printf("%lld ", x); } return 0; }