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
思路:如题所见这个题的数据很大,但是通过推导会发现一个亲切的东西,首先A=n+ky,设A/B=x,则得出Bx-ky=n,是不是突然豁然开朗(不懂得自行上百度查欧几里德算法补脑)
<span style="font-size:18px;">#include<stdio.h> #include<string.h> #include<algorithm> #define ll long long using namespace std; int p=9973; int kzojld(int a,int b,int &x,int &y)//这个函数返回值虽是a,b最大公约数,但我们实际需要x,所以用& { if(b==0) { x=1; y=0; return a; } int r=kzojld(b,a%b,x,y); int t=x; x=y; y=t-a/b*y;//这些都是证明出来的,直接用,有兴趣的可以自己推一推 return r; } int main() { int t; scanf("%d",&t); while(t--) { int b,n,x,y; scanf("%d%d",&n,&b); kzojld(b,p,x,y); x*=n;//其中一个整数解应为x*n/(gcd(b,p)) if(x<0)//若为负数,应转换为正数 x=x%p+p; printf("%d\n",x%p); } return 0; } </span>