之前给出来一个用扩展欧几里德算法解本问题的方法,时间上则比较慢。
试探法有时也是高效率的。
问题链接:HDU1576
根据题意,输入的n=A%9973(没有输入A),A%B=0(A必能被B整除),B与9973互素(GCD(B,9973)=1)。
解题过程首先是建立方程,然后才能编写程序。
设x=(A/B)%9973(x是最终想计算的值,满足0<=x<=9972),则9973k+x=A/B(k为整数),得A=9973Bk+xB。
因为n=A%9973与A=9973Bk+xB,所以xB%9973=n,得xB=n+9973y,亦得xB-n=9973y。
故:(xB-n)%9973=0
对于上式,只需要用试探法就可以求得x。这样,程序运行速度相当快。
需要主意的是,变量类型为long时没有AC,改为long long就AC了,有点奇怪。也许评价系统所用编译版本的long类型不是64位的,才有这种情况。
#include <stdio.h> int main(void) { int t, i, j; long long n, b, a=9973; scanf("%d", &t); for(i=0; i<t; i++) { scanf("%lld%lld", &n, &b); for(j=0; j<a; j++) if((j * b - n) % a == 0) { printf("%d\n", j); break; } } return 0; }