MENU

POJ1576

February 25, 2019 • Read: 3019 • 算法阅读设置

首先明确一点 $(\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");
  • }
  • }
  • }
Archives Tip
QR Code for this page
Tipping QR Code