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)。
Output
对应每组数据输出(A/B)%9973。
Sample Input
2
1000 53
87 123456789
Sample Output
7922
要求(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)。
Output
对应每组数据输出(A/B)%9973。
Sample Input
2
1000 53
87 123456789
Sample Output
7922
6060
题解:
x为b的逆元
根据同余公式:
ab % n =(a%n)(b%n)%n
(A/B)%9973=(A×x)%9973=(A%9973)(x%9973)%9973=nx%9973(由于x一定小于9973,所以x%9973=x)
转化为求逆元,nx-9973y=1;
代码:
#include <iostream>
using namespace std;
long long extendGcd(long long a, long long b, long long &x, long long &y)
{
if (a == 0 && b == 0)
{
return -1; // 无最大公约数
}
if (b == 0)
{
x = 1;
y = 0;
return a;
}
long long d = extendGcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
// 求逆元 ax = 1(mod n) //K * M % N = 1
//有且仅当1能被a和n的gcd整除
long long modReverse(long long a, long long n)
{
long long x, y;
long long d = extendGcd(a, n, x, y);
if (d == 1)
{
return (x % n + n) % n;
}
else
{
return -1; // 无逆元
}
}
int main()
{
int T;
cin>>T;
long long n,B;
while(T--)
{
cin>>n>>B;
long long num=modReverse(B,9973);
cout<<(n*num)%9973<<endl;
}
return 0;
}