//1576 A/B问题(扩展欧几里得)
#include<iostream>
#include<cstdio>
using namespace std;
const int MOD=9973;
void exGcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return;
}
else
{
exGcd(b,a%b,x,y);
int temp=x;
x=y;
y=temp-a/b*y;
}
}
/*
设 ax1+by1=gcd(a,b);
bx2+(a mod b)y2=gcd(b,a mod b);
根据朴素的欧几里德原理有 gcd(a,b)=gcd(b,a mod b);
则:ax1+by1=bx2+(a mod b)y2;
即:ax1+by1=bx2+(a-[a/b]*b)y2=ay2+bx2-[a/b]*by2;
也就是ax1+by1==ay2+b(x2-[a/b]*y2);
根据恒等定理得:x1=y2; y1=x2-[a/b]*y2;
*/
int main()
{
int t,n,b,x,y,temp;
cin>>t;
while(t--)
{
scanf("%d%d",&n,&b);
exGcd(b,MOD,x,y);
x*=n;
temp=(x%MOD+MOD)%MOD;
printf("%d\n",temp);
}
return 0;
}
/*
n=A%9973,则n=A-A/9973*9973。又A/B=x,则A=Bx。所以Bx-A/9973*9973=n。即Bx-9973y=n。
gcd(B,9973)=Bx1+9973y1=1;
B(nx1)-9973(-ny1)=n。
*/
1576 A/B问题(扩展欧几里得)
最新推荐文章于 2020-08-05 08:54:42 发布