让我们先来思考一个问题:7的10次方,怎样算比较快?
方法1:最朴素的想法,7*7=49,49*7=343,... 一步一步算,共进行了9次乘法。
这样算无疑太慢了,尤其对计算机的CPU而言,每次运算只乘上一个个位数,无疑太屈才了。这时我们想到,也许可以拆分问题。
方法2:先算7的5次方,即7*7*7*7*7,再算它的平方,共进行了5次乘法。
但这并不是最优解,因为对于“7的5次方”,我们仍然可以拆分问题。
方法3:先算7*7得49,则7的5次方为49*49*7,再算它的平方,共进行了4次乘法。
模仿这样的过程,我们得到一个在 O(logn) 时间内计算出幂的算法,也就是快速幂。
例:
输入:三个不超过 10000 的正整数 x,p,m。
输出:x^p mod m的值。
#include<iostream>
using namespace std;
int x, p, m, i, result;
int main()
{ cin >> x >> p >> m;
result = 1;
while (p)
{ if (p % 2 == 1)
result = result*x%m;
p /= 2;
x = x*x%m;
}
cout << result << endl;
return 0;
}