看着像扩展欧几里得,努力往上面凑吧。
令M=9973,X=A/B, Y=A/M
因为n=A%M=A-(A/M)*M=BX-MY
现在有BX-MY=n了,B和M是已知的,X,Y未知的,距离扩展欧几里得还差一点。
由于gcd(B,M)=1(题干里说了,要利用上),利用扩展欧几里得我们可以算出BX‘+MY’=1中X'和Y'的值、
(关于系数正负号的问题,还有待学习......)
X=N*X',最后为了防止X出现负数,需要处理一下。
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
typedef long long LL;
const int m=9973;
//计算 ax+by=gcd(a,b),返回gcd值,求出xy
LL Ex_gcd(LL a, LL b, LL &x, LL &y)
{
LL d;
if(a==0 && b==0) return -1;
if(b==0)
{
x = 1;
y = 0;
return a;
}
d = Ex_gcd(b, a%b, y, x);
y -= a / b * x;
return d;
}
void work()
{
LL n,b,x,y;
scanf("%I64d%I64d",&n,&b);
Ex_gcd(b,m,x,y);
x *= n;
//处理一下,防止出现X出现负数
x = (x % m + m) % m;
printf("%I64d\n", x);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
work();
return 0;
}

被折叠的 条评论
为什么被折叠?



