A/B

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

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 <= 109)。

Output

对应每组数据输出(A/B)%9973。

Sample Input

2
1000 53
87 123456789

Sample Output

7922
6060

思路:

有题目可知(A / B) % 9973 = x,这时x就是最终要求出来的值了,
(A / B) - k * 9973 = x;
A = x * B + k * 9973 * B, n = A % 9973;
n = (x * B + k * 9973 * B) % 9973;
n = x * B % 9973;
x * B + y * 9973 = n;
所以将B看作a,9973看作b, 就有了ax+by=c,最后的gcd = 1(题目说的)所以当求出x之后乘c在取余就行了。

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int mod = 9973;
void Exgcd(ll a, ll b, ll &x, ll &y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return ;
    }
    Exgcd(b, a % b, x, y);
    ll t = x;
    x = y;
    y = t - a / b * y;
}
int main() {
    ll n, b, t;
    scanf("%lld", &t);
    while (t--) {
        ll x, y;
        scanf("%lld %lld", &n, &b);
        Exgcd(b, mod, x, y);
        x *= n;
        x = (x % mod + mod) % mod;
        printf("%lld\n", x);
    }
    return 0;
}