「杂题乱刷2」P1226 【模板】快速幂

题目链接

P1226 【模板】快速幂

题意简述

\(a^b \bmod p\) 的值。

解题思路

前置知识

两个同底数的数字相乘的结果,比如 \(a^b \times a^c = a^{b+c}\),这一点是显然的,不过多赘述。

原理

发现可以把 \(b\) 拆成二进制数。

那么此时对于一个二进制数 \(x\) 从低到高每一位的权重为 \(2^0, 2^1, 2^2, 2^3, \dots, 2^{\lfloor \log x \rfloor}\)

也就是说我们只需要求出 \(a^{2^0}, a^{2^1}, a^{2^2}, a^{2^3}, \dots, a^{2^{\lfloor \log x \rfloor}}\),再将所有权重依次相乘即可得到 \(a^b\) 的值。

那么我们考虑如何求出这些 \(a^{2^{0 \sim \lfloor \log x \rfloor}}\) 这些数字的值。

由于有 \(2^x \times 2^x = 2^{2x}\),那么你发现非常简单的,你可以定义一个变量 \(y\) 初始为 \(x\),对于每增加一位,都将 \(y\) 重新赋值为 \(y^2\),那么你发现此时根据前面的结论,恰好指数都是 \(2\) 的整数次幂,满足了这一条件,因此这个做法是正确的。

时间复杂度为 \(O(\log b)\)

参考代码

只给出快速幂的代码。

ll pw(ll a,ll b,ll p)
{
	ll ans=1;
	while(b)
	{
		if(b&1)
			ans=ans*a%p;
		a=a*a%p;
		b>>=1;	
	}
	return ans;
}
posted @ 2025-04-09 15:12  wangmarui  阅读(12)  评论(0)    收藏  举报