Problem Description
要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。
Input
数据的第一行是一个T,表示有T组数据。
每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。
每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。
Output
对应每组数据输出(A/B)%9973。
Sample Input
Sample Output
n=A%9973
,则
n=A-A/9973*9973
。又
A/B=x
,则
A=Bx
。所以
Bx-A/9973*9973=n
。即
Bx-9973y=n,x=(x%9973+9973)%9973。
#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
void extentgcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=1;
y=0;
}
else
{
extentgcd(b,a%b,y,x);
y-=x*(a/b);
}
}
int main()
{
int T;
cin>>T;
for(int i=1;i<=T;i++)
{
int n,b;
cin>>n>>b;
int x,y;
extentgcd(b,9973,x,y);
x=x*n;
x=(x%9973+9973)%9973;//为了防止x为负数
cout<<x<<endl;
}
return 0;
}
拓展欧几里德模板
void extentgcd(int a,int b,int &x,int &y)//ax+by=gcd(a,b)中x,y的值
{
if(!b)
{
x=1;
y=0;
}
else
{
extentgcd(b,a%b,y,x);
y-=x*(a/b);
}
}
注意:对于a*x+b*y=c;当c是gcd(a,b)的倍数时才有解
x=(x%9973+9973)%9973可以这样处理得到非负最小的x
y=(c-a*x)/b;