题目意思:要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。
这是我第一次写逆元首先先讲一下什么是逆元
a*x≡1 mod m 其中x就是a关于模数m的逆元
此题因为A比较大,我们不能求出A/B但是我们可以求出B的逆元然后用A去乘B的逆元即可。
转换如下
bx≡1(mod m)
bx = 1 +my
bx-my=1
用扩展欧几里得求得x即可
#include<bits/stdc++.h>
#define MOD 9973
using namespace std;
/***d是最小公约数 ax+by=d x,y用了引用***/
long long extend_gcd(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=extend_gcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
/***求逆元
ax=1(mod m)***/
long long mod_reverse(long long a,long long m)
{
long long x,y;
long long d=extend_gcd(a,m,x,y);
if(d==1) return (x%m+m)%m;
else return -1;
}
int main()
{
int t;
int n,B;
scanf("%d",&t);
while(t--) {
scanf("%d%d",&n,&B);
int x=mod_reverse(B,MOD);
printf("%d\n",n*x%MOD);
}
return 0;
}