文章

1

粉丝

60

获赞

4

访问

585

头像
取模运算 题解:
P5133
发布于2024年3月10日 15:03
阅读数 585

#include <iostream>
#include <string>
using namespace std;

// 快速幂取模原理
// 首先,快速幂取模得以实现,基础是 (a * b) % c = ((a % c) * (b % c)) % c,此处不再证明这条式子。

int pow_mod(int x, int y,int mod) {
	int ans = 1;
	x = x % mod;
	while(y > 0) {
		if(y & 1) {
			ans = (ans * x) % mod;// 原理在上面
		}
		x = (x * x) % mod;
		y >>= 1;
	}
	return ans;
}

// 计算字符串表示的大整数对模数Z取模的结果
int mod_string(const string &numStr, int Z) {
	int result = 0;
	int base = 1; // 用于计算每一位的权重

	// 从字符串的末尾开始遍历,因为大整数的最低位存储在字符串的开始位置
	for (int i = numStr.size() - 1; i >= 0; --i) {
		// 将当前位的数字加到结果中,并考虑前一位的进位
		result = (result + (numStr[i] - '0') * base) % Z;
		// 更新权重为下一个更高的位
		base = (base * 10) % Z;
	}

	return result;
}


// 一句话,模运算在加法和乘法运算具有封闭性
int main() {
	string x;
	int y,z;
	while(cin >> x >> y >> z){
		int x1 = mod_string(x,z);
		cout << pow_mod(x1,y,z) << endl;	
	}
}

 

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发