题意:要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。
思路:求乘法逆元
满足a*k≡1 (mod p)的k值就是a关于p的乘法逆元。当且仅当gcd(k,p) = 1,如果可逆则可定义除法 x/k = x * a mod p
为什么要有乘法逆元呢?
当我们要求(a/b) mod p的值,且a很大,无法直接求得a/b的值时,我们就要用到乘法逆元。
我们可以通过求b关于p的乘法逆元k,将a乘上k再模p,即(a*k) mod p。其结果与(a/b) mod p等价。
B的逆元就用扩展欧几里德解 k*B = 1 mod n --> k*B + m*n = 1;
#include
#include
#include
#include
using namespace std;
typedef long long int64;
int64 Exgcd(int64 a,int64 b,int64 &x,int64 &y)
{
if(b == 0)
{
x = 1,y = 0;
return a;
}
else
{
int64 r = Exgcd(b,a%b,x,y);
int64 temp = x;
x = y, y = temp - a/b*y;
return r;
}
}
int main()
{
int t;
int64 n,b = 9973,B,x,y;
scanf("%d",&t);
while(t--)
{
scanf("%I64d%I64d",&n,&B);
int64 d = Exgcd(B,b,x,y);
b = b / d;
x = x / d ;
x = (x % b + b) % b;
printf("%I64d\n",(n%9973 * x%9973)%9973);
}
return 0;
}