
根据如下公式推导:

得到: Nr = N%(k-1),由此得到最终的结果值为N%(k-1),当值为0时由于值域限制>0,结果就为k-1。问题就转为求N%(k-1)
这题考到了快速幂取模,首先第一个问题幂积的值(N)太大,无法保存下来,所以要分部取模。这里的原理是积的模等于模的积。要想分部就要将求幂的过程分部,这就用到了二分求幂:
#include <iostream>
#include <cstdio>
using namespace std;
int QuickPower(int x, int y, int k) {
int result = 1;
x %= k;
while(y != 0) { //二分求幂
if(y % 2 == 1) {
result *= x;
result %= k;
}
x = (x * x) % k; //乘积取模保证过程的值不会太大
y /= 2;
}
return result % k;
}
int main() {
int x, y, k;
while (scanf("%d%d%d", &x, &y, &k) != EOF) {
int result = QuickPower(x, y, k - 1);
if (x != 0 && result == 0) { //因为题目要求结果>0,所以0就要转化为k-1
result = k - 1;
}
printf("%d\n", result);
}
return 0;
}
该博客探讨了在数值过大无法直接计算时,如何利用快速幂取模算法进行高效运算。通过二分求幂的方法,避免了中间结果过大,确保计算过程中始终对模取余,从而解决大数乘方的问题。代码示例展示了C++实现的快速幂取模函数,并在处理特定条件(结果需大于0)时进行了特殊处理。

858

被折叠的 条评论
为什么被折叠?



