数论的题目,问的很明显。因为n=A%9973,所以A-A/9973*9973=n,(计算机的除法直接取整)。又因为A=k*B,并且B*x+9973*y=1,题目问的是(A/B)%9973也就是k%9973是多少,现在A-A/9973*9973=n,转化为B*k-9973*y=n,也就是把A/9973看成整体就好了。又有B*x+9973*y=1,这个x和y可以用扩展欧几里德直接求出,k=n*x,关键如果k是负的怎么办?看程序。
#include<iostream>
using namespace std;
int x,y,q;
void extendedgcd(int a,int b)
{
if(b==0)
{
x=1;
y=0;
q=a;
}
else {
extendedgcd(b,a%b);
int temp;
temp=x;
x=y;
y=temp-a/b*y;
}
}
int main()
{
int t,n,b,ans;
cin>>t;
while(t--)
{
cin>>n>>b;
extendedgcd(b,9973);
x=x*n;
ans=(x%9973+9973)%9973;
cout<<ans<<endl;
}
return 0;
}
本文解析了一道关于数论的编程题目,通过扩展欧几里德算法求解特定条件下A/B模9973的问题。文章给出了完整的C++实现代码,并详细解释了算法原理。
1259

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



