@xunuo
2017-02-27T19:47:05.000000Z
字数 987
阅读 1043
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
数论
要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。
数据的第一行是一个T,表示有T组数据。
每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。
对应每组数据输出(A/B)%9973。
2
1000 53
87 123456789
7922
6060
解题思路:
n=A%9973 ==> n=A-A/9973*9973
又∵A/B=x ==> A=Bx
∴Bx-A/9973*9973=n
==> Bx-9973y=n
∵gcd(B,9973)=BX1+9973Y1=1;即可求出X1
等式两边同乘以n
故 B(nX1)-9973(-nY1)=n
可知nX1就是BX-9973Y=n的解
∴x=nx1
为避免负数出现答案应该为(x%9973+9973)%9973
代码:
void e_gcd(int a,int b,int &x,int &y)
{
int t;
if(b==0)
{
x=1;
y=0;
return;
}
else
{
e_gcd(b,a%b,x,y);
t=x;
x=y;
y=t-(a/b)*y;
}
}
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define ll long long
#define mod 9973
void e_gcd(int a,int b,int &x,int &y)
{
int t;
if(b==0)
{
x=1;
y=0;
return;
}
else
{
e_gcd(b,a%b,x,y);
t=x;
x=y;
y=t-(a/b)*y;
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,b,x,y,ans;
scanf("%d%d",&n,&b);
e_gcd(b,mod,x,y);
x*=n;
ans=(x%mod+mod)%mod;
printf("%d\n",ans);
}
return 0;
}