题解: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)    收藏  举报

导航