题解:P1226 【模板】快速幂
朴素算法需要将 \(b\) 个 \(a\) 相乘,复杂度为 \(O(n)\),无法通过此题。
参考幂运算的性质,即:
\[a^{m + n} = a^m \times a^n
\]
迁移至此题,可将 \(b\) 二进制拆分,定义函数 \(f(x)\) 为二进制下 \(b\) 的第 \(x\) 位是否为 \(1\)。若 \(f(x) = 1\),答案乘上 \(a^{2^x}\) 即可。
解决几个问题:
- 如何求 \(f(x)\)?每次令 \(b\) 除以二,若末尾为 \(1\),第 \(x\) 轮的 \(f(x)\) 就等于一。
- 怎么求 \(a^{2^x}\)?设定 \(base\) 最开始为 \(a\),每次变为自己的平方即可。
- 为什么变为自己的平方即可?\(a^{2^x} = a^{x^2}\),注意到上方有一个 \(2\),即每次平方。
注意细节即可,由于二进制的原因,复杂度为 \(O(\log b)\):
#include<bits/stdc++.h>
using namespace std;
long long a, b, p;
long long fastpow(long long a, long long b){
long long ans = 1, base = a;
while(b){
if(b & 1) ans = ans * base % p;
base = base * base % p;
b >>= 1;
}
return ans;
}
int main(){
cin >> a >> b >> p;
cout << a << "^" << b << " mod " << p << "=" << fastpow(a, b);
return 0;
}
posted on 2025-03-04 18:55 zhangzirui66 阅读(30) 评论(0) 收藏 举报