A/B
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4376 Accepted Submission(s): 3383
Problem Description
要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。
Input
数据的第一行是一个T,表示有T组数据。
每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。
每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。
Output
对应每组数据输出(A/B)%9973。
Sample Input
2 1000 53 87 123456789
Sample Output
79226060
先是推导不定方程:n=A%9973,所以n=A-A/9973*9973;(计算机乘除),令A/B=x,只要求出x然后模上9973就得到了答案,A/B=x,所以A=B*x;所以B*x-A/9973*9973=n;所以B*x-9973*y=n;用扩展gcd求出B*x-9973*y=1的x0,然后x=x0*n;又有可能求得x为负数,所以求出x之后要加上一个周期9973再模9973即可,((x*n)%9973+9973)%9973;
代码如下:
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int kuozhangcd(int a,int b,int &x,int &y){ if(b==0){ x=1;y=0; return a; } int r=kuozhangcd(b,a%b,y,x); y-=a/b*x; return r; } int main(){ int t; scanf("%d",&t); while(t--){ int n,b; scanf("%d %d",&n,&b); int x,y; kuozhangcd(b,9973,x,y); //x*=n; int ans=((x*n)%9973+9973)%9973; printf("%d\n",ans); } return 0; }