题意:要求 (A/B)%9973,但由于 A 很大,只给出了
思路:要求 ans=(A/B)%9973,转换可得 A=9973×k×B+ans×B。又由n(n=A%9973)可得,n=(9973×k×B+ans×B)%9973=ans×B%9973,可以将 n=ans×B%9973 写成 B×ansn+(−kn)×9973=gcd(B,9973)=1。
然后用扩展欧几里得算出 ansn,然后乘以 n 就得到 ans 了,不过要注意取模。
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<stack>
#include<queue>
#include<utility>
#include<vector>
#include<cmath>
#include<set>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int MOD = 9973;
void ExtendGcd(int a, int& x, int b, int& y)
{
if(b == 0){
x = 1;
y = 0;
}
else{
ExtendGcd(b, y, a%b, x);
y -= (a/b)*x;
}
}
int main()
{
int T;
int n, B;
scanf("%d", &T);
while(T--){
scanf("%d%d", &n, &B);
int x, y;
ExtendGcd(B, x, MOD, y);
x = (x%MOD+MOD)%MOD;
printf("%d\n", (x*n)%MOD);
}
return 0;
}

262

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



