转载请注明出处:忆梦http://blog.csdn.net/yimeng2013/article/details/11822115
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576
题解:
由题意有:
①gcd(B,9973) = 1) ,B和9973互质。
②A必能被B整除→A=B*x ……①式
③n=A%9973→A = n + 9973*y ……②式
由①式和②式有 B*x = n + 9973*y 得出 B*x - 9973*y = n 满足扩展欧几里得定理
B*x + 9973*y = gcd(B,9973) (gcd(B,9973) = 1))这里相当于y取原始式的负值
从而得到所求的式子为 B*x + 9973*y = 1 其中的x即为 A/B
//回归数论第一题
#include<cstdio>
#include<cstring>
#define m 9973
int x, y;
int gcd(int a,int b)
{// x,y用全局变量保存
int t,d;
if(b==0)
{
x=1;
y=0;
return a;
}
d=gcd(b,a%b);
t=x;
x=y;
y=t-(a/b)*y;
return d;
}
int main ()
{
int T;
scanf("%d", &T);
while(T--)
{
int n, b;
scanf("%d %d", &n, &b);
int d = gcd(b,m); //b,m互质 d 其实就等于1
x = x * n/d % m; //因为求的是B*x+9973*y=1,所以要乘以n。这里也可以写为x = x * n % m; 因为d = 1
if(x<0) x=x+9973; //防止x为负数
printf("%d\n",x%m);
}
return 0;
}