快速幂¶
递归的方法实现
//LeetCode 50
#include <cmath>
class Solution {
public:
double myPow(double x, long long n) {
if(n == 0) return 1.0;
if(n == 1) return x;
if(n == -1) return 1.0 / x;
if(n % 2 == 0) {
double res = pow(x, n / 2);
return res * res;
}
else {
double res = pow(x, (n - 1) / 2);
return res * res * x;
}
}
};
非递归的实现:
#include <cmath>
class Solution {
public:
double myPow(double x, long long n) {
if(n == 0) return 1.0;
if (n < 0) {
x = 1.0 / x;
n *= -1;
}
double res = 1;
while (n != 0) {
if (n & 1) res = res * x;
x = x * x;
n >>= 1;
}
return res;
}
};
矩阵快速幂¶
OI Wiki的应用总结:
- 模意义下取幂
- 计算斐波那契数(可以和卡特兰数结合)
- 多次置换
- 加速几何中对点集的操作
- 定长路径计数
- 模意义下的大整数乘法
- 高精度快速幂
https://oi-wiki.org/math/quick-pow/
矩阵快速幂等
典型题目:
- 洛谷 P3390
- UVA 1374
- P 5245
- P 1226(快速幂模板)
- 1874
- P 5349
- P 1010
- UVA 766
- P1517
- P 5394
- P 2699
- P 5273
- UVa 1230 - MODEX
- UVa 374 - Big Mod
- UVa 11029 - Leading and Trailing
- Codeforces - Parking Lot
- SPOJ - The last digit
- SPOJ - Locker
- LA - 3722 Jewel-eating Monsters
- SPOJ - Just add it