题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1576
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 6060
由题意,需要求A/B得到的倍数模上9973.
因为A = n + 7773*x,
所以9973*x+n = B*y (y代表A是B的多少倍)
变形得9973*x - B*y = -n
令a = 9973,b = -B, c = -n,
用去解ax+by=c的典型扩展欧几里得即可。
最后求出的y可能是负数,所以y%9973可能还是负数,此时需要再加上9973变成正数,所以是y%9973+9973,如果y是正数的话,算出来的结果应该直接是y%9973,所以再前一种结果上模9973不管y是正数负数都一样了,所以结果是(y%9973+9973)%9973
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
// 扩展欧几里得算法
int ex_gcd(int a,int b,int &x,int &y) {
if(b == 0) {
x = 1;
y = 0;
return a;
}
int ret = ex_gcd(b,a%b,y,x);
y -= a/b*x;
return ret;
}
int main()
{
int t;
scanf("%d",&t);
int n,B;
int x,y;
while(t--) {
scanf("%d%d",&n,&B);
ex_gcd(9973,-B,x,y);
y *= -n;
y = (y%9973+9973)%9973;
printf("%d\n",y);
}
return 0;
}