光速幂
STA_Morlin · · 算法·理论
光速幂
k 进制倍增
$$a^x \bmod p$$
1. 朴素
基本的欧拉降幂就不说了,可以将
考虑分块预处理,令
预处理
这里
这样空间复杂度
这玩意还可以用类似方法搞搞扩域光速幂,矩阵光速幂啥的(不过可能欧拉定理不适用要注意一下).
Code:
template<int MOD>
struct FastPow
{
private:
ll p1[66666],p2[66666];
static ll qpow(ll a,ll n)
{
ll ans=1;
while (n)
{
if (n&1) ans=ans*a%MOD;
a=a*a%MOD; n>>=1;
} return ans%MOD;
}
public:
explicit FastPow(ll a)
{
ll t1=a,t2=qpow(t1,65536); p1[0]=p2[0]=1;
for (int i=1;i<65536;i++) p1[i]=p1[i-1]*t1%MOD;
for (int i=1;i<65536;i++) p2[i]=p2[i-1]*t2%MOD;
}
ll operator()(unsigned n){return p2[n>>16]%MOD*p1[n&65535]%MOD;}
};
例题:块速递推
2. 不朴素
我们这个
类似快速幂,我们拆
左边预处理,右边做递归 .
这一般被叫做
这个可以用来调节预处理复杂度和询问复杂度,例如
空间复杂度
例题:能量采集