题解:点击打开链接
题意:一个数的整数次幂,是我们在计算中经常用到的,但是怎么可以在
O(log(n)) 的时间内算出结果呢?
代码框中的代码是一种实现,请分析并填写缺失的代码,求 xymodp的结果。
题解:首先需要明白快速幂的思想。不懂得小伙伴看一下我的这篇博客:https://blog.csdn.net/pk__pk/article/details/78954671讲的矩阵快速幂。也讲了快速幂。
明白了快速幂的思想之后我们再来看我们需要补全的代码。
主函数是输入输出没什么用。pass。
然后看一下pw函数。我们发现他有三个参数,x,y,p。代表x的p次方取余p。返回值为int形。
再看第一个if语句表示若y==0 返回1.我们可以想一想。为什么会出现这句话。很容易想到a的0次方是1。也就是快速幂的结束条件。我们就不难想到。这是一个用递归的方法实现的快速幂。
然后再看第二个if语句。表示若y为奇数。res乘上x。
然后返回res的值。很明显res是pw函数的值。
在回忆一下快速幂的步骤。
若y为偶数
1.x *= x;
2.y /= 2;
若y为奇数
1. res *= 2;
2 x *= x
3 y /= 2
我们会发先少了偶数的部分。
那么很自然的就能推出结果为 res = pw(x*x,y/2,p);
#include <iostream>
using namespace std;
int pw(int x, int y, int p) {
if (!y) {
return 1;
}
int res = pw(x*x,y/2,p);
if (y & 1) {
res = res * x % p;
}
return res;
}
int main() {
int x, y, p;
cin >> x >> y >> p;
cout << pw(x, y, p) << endl;
return 0;
}