1576 A/B问题(扩展欧几里得)

//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。
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

u014068781

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值