按题意解得到方程组bx+9973y=n,其中x就是答案,也就是二元一次方程的解,因为b的范围已经确定,所以可以枚举b来解,但是我们不用这种方法方法,用扩展欧几里得算法解,主要是练习下这个算法。
代码如下:
#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<time.h>
#include<math.h>
#define eps 1e-9
#define pi acos(-1.0)
#define P system("pause")
using namespace std;
void ex_gcd(int a,int b,int &d,int &x,int &y) //扩展欧几里得算法,这是模板,其中x,y是解,d是最大公约数
{
if(!b){
d=a;x=1;y=0;
}
else {
ex_gcd(b,a%b,d,y,x);
y-= x*(a/b);
}
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int t,n,b;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&b);
int x,y,a=9973,g;
ex_gcd(b,a,g,x,y); //调用模板函数达到g,x,y 这里的x是bx+9973y=gcd(b,9973)的解
x=x*n/g; //得到bx+9973=n的x解
x=(x%9973+9973)%9973;
printf("%d\n",x);
}
return 0;
}