4C: A/B

题目来源
要求(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;
}
发布了14 篇原创文章 · 获赞 0 · 访问量 146

猜你喜欢

转载自blog.csdn.net/loaf_/article/details/104010613
4C:
今日推荐