首先明确一点 $(\frac {A}{B}) \% 9973 \neq \frac {A\%9973}{B\%9973}$
但是 $(\frac {A}{B}) \% 9973 = (A \times C)\%9973$,其中 $C$ 是 $B$ 关于 $9973$ 的逆元,即 $BC\equiv 1 (mod\ 9973)$
根据乘法交换律得 $(A\times C) \% 9973 = (C \times A) \% 9973 = (C \% 9973 \times A \% 9973) \% 9973$,由于题目已经给出了 $n=A\%9973$,所以最终:
$$ (\frac{A}{B})\%9973 = (C\% 9973 \times n)\% 9973\ \ (BC\equiv 1 (mod\ 9973)) $$
- import java.util.Scanner;
-
- public class Main {
- static long x, y;
- static long exgcd(long a, long b) {
- if (b == 0) {
- x = 1;
- y = 0;
- return a;
- }
- long res = exgcd(b, a % b);
- long x1 = x;
- x = y;
- y = x1 - (a / b) * y;
- return res;
- }
-
- static long linearEquation(long a, long b, long m) throws Exception {
- long d = exgcd(a, b);
- if (m % d != 0)
- throw new Exception("Impossible");
- long n = m / d;
- x *= n;
- y *= n;
- return d;
- }
-
- static long inverseElement(long a, long b) throws Exception {
- long d = linearEquation(a, b, 1);
- x = (x % b + b) % b; // 保证x>0
- return d;
- }
-
- public static void main(String[] args) {
- Scanner cin = new Scanner(System.in);
- int T = cin.nextInt();
- try {
- while ((T--) != 0) {
- int n = cin.nextInt();
- long b = cin.nextLong();
- inverseElement(b, 9973);
- System.out.println((x * n) % 9973);
- }
- } catch (Exception e) {
- System.out.println("Impossible");
- }
- }
- }