题目来源
要求(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
解法
(A/B)%9973 = (AB^(-1))%9973 = (A%9973 * B^(-1) % 9973) %9973 = (n B^(-1) % 9973) %9973
化成这样应该看得出来是用费马小定理求逆元吧
费马小定理
若gcd(a, p)=1, 则a^(p-1) = 1(mod p) //没有三条杠的等号,将就一下
由此可知 a^(p-2) * a =1(mod p)
所以只要输出(n* B^(9971)) %9973, 用快速幂取模处理下即可
代码
#include <iostream>
using namespace std;
long long int qpow(long long int B, long long int b){
long long int res = 1;
while(b){
if(b & 1) res *= B;
res %= 9973;
B *= B;
B %= 9973;
b /= 2;
}
return res;
}
int main() {
unsigned long long int T, n, B;
cin >> T;
while(T--) {
cin >> n >> B;
long long int ans = qpow(B, 9971);
cout << (n%9973 * ans%9973) %9973 << endl;
}
return 0;
}