@xunuo
2017-02-27T11:47:05.000000Z
字数 987
阅读 1408
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 9973void 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;}
