intmain(void){ // 快速幂法 int base = 2; // 底数2 int power = 14; // 指数n int result = 1; // 结果 while (power) { if (power & 1) { result *= base; } base *= base; power >>= 1; } printf("%d", result); return0; }
intmain(void){ int base = 3; int power = 5, result = 1; while (power) { if (power & 1) { result *= base; } base *= base; power >>= 1; } printf("%d", result); return0; }
进阶--递归法
1 2 3 4 5
longlongfastPow(longlong a, longlong b){ if (b == 0) return1;//截止条件 longlong half = fastPow(a, b/2);//递归基 return (b % 2) ? half * half * a : half * half;//结果整合 }
必备知识
(a \times b) \bmod c = ((a \bmod c) \times (b \bmod c)) \bmod c 这里我们或许认为很难以记忆
其实确实不好理解 但是我们直接简记:层层求模
应用方法
题目
给定一个整数n求,2n对于1007的模;
思维链
首先要求幂运算,我们可以想到快速幂法
其次要求模,刚好结合我们的扩展
现在开始拆分
首先 result = result * base
我们当然第一时刻想到的是直接对最终结果求mod
但是显而易见,计算机的数据储存很可能不足
所以我们采用扩展的公式
对result和base分别求mod 思考结果:更改开头代码对二者分别求mod
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include<cstdio>
intmain(void){ int base = 2; int power, result = 1; scanf("%d", &power); while (power) { if (power & 1) { result = (result * base) % 1007; } base = (base * base) % 1007; power >>= 1; } printf("%d", result); return0; }