数据的第一行是一个T,表示有T组数据。 每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。
输出:
对应每组数据输出(A/B)%9973。
样本输入:
2 1000 53 87 123456789
样本输出:
7922 6060
方法:扩展欧几里得
思路:令m = 9973,inv(a)表示a关于m的逆元,根据题意可得 (A / B) % m = ((n + k * m) * inv(B)) % m = ((n + k * m) % m) * (inv(B) % m) = (n % MOD) * (inv(B) % MOD) = n * inv(B) % m。所以只需求n * inv(B) % m的值即可。本题使用扩展欧几里得求逆元。
publicstaticvoidmain(String[] args){ Scanner sc = new Scanner(System.in); int T = sc.nextInt(); long m= 9973; while (T-- > 0) { long n = sc.nextLong(); long B = sc.nextLong(); long result = n * inv(B) % m; System.out.println(result); } } privatestaticlong x,y; // 拓展欧几里得算法 privatestaticvoidexgcd(long a, long b){ if (b == 0) { x = 1; y = 0; return ; } exgcd(b, a % b); long k = x; x = y; y = k - a / b * y; } // 求逆元 privatestaticlonginv(long a){ long b = 9973; exgcd(a, b); return (x + b) % b; } }