求 ab mod p的值, 其中a, b, q的值是整数,保证 0≤a, b<231,a+b>0,2≤p<231。
如果直接计算ab肯定超过数据范围,所以我们采取快速幂的方式。
若b为偶数,则
若b为奇数,则
取运算性质: (x*y)%p= (x%p*y%p)%p
证明: 设 x=kp+q1, y=kp+q2, 则 x%p=q1, y%p=q2。
(x*y)%p= ((kp+q1)*(kp+q2))%p=((kp)2+kp(q1+q2)+q1*q2)%p=(p(k2p+q1+q2)+q1*q2)%p=(q1*q2)%p=(x%p*y%p)%p
代码实现:
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 | /**************************************************************** * Description: C++ implementation of fast power 快速幂 luogu P1226 * Author: Alex Li * Date: 2023-07-24 19:48:43 * LastEditTime: 2024-02-02 07:48:28 ****************************************************************/ #include <iostream> // 引入输入输出流库 using namespace std; // 使用标准命名空间 int a, b, p, result; // 声明全局变量a(底数),b(指数),p(模数),result(结果) int main(){ cin >> a >> b >> p; // 从标准输入读取底数a,指数b和模数p result = 1; // 初始化结果为1,因为任何数的0次幂都是1 while (b) { // 当b不为0时执行循环 if (b % 2 == 1) { // 如果b是奇数 result = (result * a) % p; // 更新result为result与a的乘积对p取模 b /= 2; // 将b除以2,进行下一轮计算 a = (a * a) % p; // 将a更新为a的平方对p取模 } else { // 如果b是偶数 b /= 2; // 将b除以2,进行下一轮计算 a = (a * a) % p; // 将a更新为a的平方对p取模 } } cout << result << endl; // 输出最终的计算结果 return 0; // 程序正常结束 } |
洛谷: P1226