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)。
Output
对应每组数据输出(A/B)%9973。
Sample Input
2 1000 53 87 123456789
Sample Output
7922 6060
扩展欧几里得模板
扩展欧几里得模板
由题意得
\[
ans=(\frac{A}{B})\%9973\\
n=A\%9973 \\
得ans*B+9973*x = A = n+9973*y \\
\frac{ans}{n} *B+9973*(x*B-y) = n \\
因gcd(B, 9973) = 1 \\
即形如ax+by = gcd(a, b)
\]
#include <iostream> #include <algorithm> #include <string> #include <cstring> #include <cmath> #include <vector> #include <map> #include <set> #include <queue> #include <stack> #include <iomanip> #include <cstdio> using namespace std; typedef long long LL; typedef pair<double, double> PDD; typedef pair<LL, LL> PLL; const LL N = 1e6+50; const LL MOD = 1e9+7; const LL INF = 0x3f3f3f3f; #define lson l, m, rt>>1 #define rson m+1, r, rt>>1|1 LL exgcd(LL a, LL b, LL &x, LL &y) { if(!b) { x = 1;y = 0; return a; } LL ret = exgcd(b, a%b, y, x); y -= x*(a/b); return ret; } int main() { int T;cin >> T; while(T--) { LL n, B;cin >> n >> B; LL x, y; exgcd(B, 9973, x, y); cout << ((x*n)%9973+9973)%9973 << endl;//x可能为负数 } return 0; }