背景知识:
1.位运算
在C++中,位运算是对整数类型的位进行操作的一种运算方式。常见的位运算符包括按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<<)和右移(>>)等。这些运算符可以用来对整数的二进制表示进行操作,实现一些特定功能。下面是对常见位运算操作的简要解释:
-
按位与(&):将两个数的对应位都为1的情况下得到1,否则为0。
例如:
5 & 3
的结果是1
,因为5
的二进制表示是101
,3
的二进制表示是011
,按位与后得到001
,即1
。 -
按位或(|):将两个数的对应位只要有一个为1就得到1,否则为0。
例如:
5 | 3
的结果是7
,因为5
的二进制表示是101
,3
的二进制表示是011
,按位或后得到111
,即7
。 -
按位异或(^):将两个数的对应位相异时得到1,相同时得到0。
例如:
5 ^ 3
的结果是6
,因为5
的二进制表示是101
,3
的二进制表示是011
,按位异或后得到110
,即6
。 -
取反(~):对操作数的每一位取反(0变1,1变0)。
例如:
~5
的结果是-6
,因为5
的二进制表示是000...0101
,取反后得到111...1010
,这是补码表示,转换为十进制即为-6
。 -
左移(<<):将一个数的二进制表示向左移动指定的位数。
例如:
5 << 1
的结果是10
,因为将5
的二进制表示101
向左移动一位得到1010
,即10
。 -
右移(>>):将一个数的二进制表示向右移动指定的位数。
例如:
5 >> 1
的结果是2
,因为将5
的二进制表示101
向右移动一位得到10
,即2
。
2.快速幂的原理
快速幂算法的基本思想是利用二进制分解来减少运算次数。具体步骤如下:
- 将指数
n
转化为二进制形式。 - 从二进制形式的最低位开始,依次检查每一位:
- 如果该位为
1
,则乘以当前的幂值base
。 - 如果该位为
0
,则不进行乘法操作。
- 如果该位为
- 每次处理完一位,将底数
base
自乘一次,表示底数的幂次增加一倍。 - 继续处理下一位,直到处理完所有位。
举个例子:
计算 3^5,以下是上述抽象过程的演示:
-
首先,将指数 5 转换为二进制形式:5 的二进制表示为 101。
-
从二进制形式的最低位开始逐位处理:
- 初始时,底数为 3,ans为 1。
- 第一位为 1,ans乘以当前的幂值 3:结果为 3。base自乘一次为9。
- 第二位为 0,不进行乘法操作,底数自乘一次:底数变为81,ans不动。
- 第三位为 1,ans乘以当前的底数81,ans变为3×81=243。
其次引入核心问题。
P1. 洛谷p1226快速幂
long long fastPowerMod(long long base, long long exponent, long long c) {
long long result = 1;
base = base % c; // Take base mod c to handle large base values
while (exponent > 0) {
if (exponent & 1) { // Check if the current bit is 1
result = (result * base) % c;
}
base = (base * base) % c; // Square the base and take mod c
exponent = exponent >> 1; // Shift the bits of the exponent to the right
}
return result;
}