根据如下公式推导:
得到: 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;
}