快速幂
睡不醒的鲤鱼 2021-12-19 常用算法 数学知识
# 一、算法思想
快速幂,思想是将取幂的任务 按照指数的二进制表示来分割成更小的任务。
首先我们将 表示为 2 进制,举一个例子:
因为 有 个二进制位,因此当我们知道了 后,我们只用计算 次乘法就可以计算出 。
根据以上推导,可把计算 转化为解决以下两个问题:
- 计算 的值: 循环赋值操作 即可;
- 取出指数 n 的二进制中的每一位:当值为 1 时,结果累乘 x。
# 二、算法模板
C++
说明
模意义下取幂:取模的运算不会干涉乘法运算,因此我们只需要在计算的过程中取模即可。
# 三、代码实战
# AcWing 0875
题目:快速幂
给定 组 ,对于每组数据,求出 的值。
输入格式
第一行包含整数 。
接下来 行,每行包含三个整数 。
输出格式
对于每组数据,输出一个结果,表示 的值。
每个结果占一行。
数据范围
输入样例:
2
3 2 5
4 3 9
输出样例:
4
1
解答代码:
#include <iostream>
using namespace std;
typedef long long LL;
LL binPow(LL x, LL k, LL p)
{
LL ans = 1;
while (k) {
if (k & 1) ans = ans * x % p;
x = x * x % p;
k >>= 1;
}
return ans;
}
int main()
{
int n;
scanf("%d", &n);
while (n--) {
LL x, k, p;
scanf("%lld%lld%lld", &x, &k, &p);
printf("%lld\n", binPow(x, k, p));
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30