要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。
每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。
2 1000 53 87 123456789
7922 6060
A/B%9973=k-==>A/B=9973*x+k==>A=9973Bx+kB==>n=kB%9973==>kB=9973y+n==>(k/n)B-9973y/n=1==> e_gcd(B,9973)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#define mod 9973
using namespace std;
int gcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
int ans=gcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return ans;
}
int main()
{
int x,y,n,b,t;
cin>>t;
while(t--)
{
scanf("%d%d",&n,&b);
int ans=gcd(b,mod,x,y);
x=(x%mod+mod)%mod;
printf("%d\n",x*n%mod);
}
}
本文介绍了一种求解模逆元的算法,通过扩展欧几里得算法(e_gcd)来解决大数A除以B后余数的问题,特别针对A远大于B的情况,并提供了一个具体的C++实现示例。
2304

被折叠的 条评论
为什么被折叠?



