光速幂
光速幂,在 \(O(\sqrt n)\) 的时间复杂度内预处理,以 \(O(1)\) 的时间复杂度求幂,用于求解同一底数和模数,多次求幂。
假设底数为 \(x\),模数为 \(p\),首先预处理 \(x^0,x^1,x^2...x^{\sqrt n}\),再预处理 \(x^0,x^{\sqrt n},x^{2\sqrt n}...x^n\),其中 \(n\) 为指数的范围。
对于每一个 \(k\),可以得到 \(x^k=x^{\left \lfloor\frac{k}{\sqrt n}\right \rfloor*\sqrt n}*x^{k\mod \sqrt n}\).
struct LightPow{
int base[50005][2],mod,sq=50000;
inline void init(int x,int p){
mod=p;
base[0][0]=base[0][1]=1;
for(int i=1;i<=sq;i++)base[i][0]=base[i-1][0]*x%mod;/*预处理x^i到x^sqrt(n)*/
for(int i=1;i<=sq;i++)base[i][1]=base[i-1][1]*base[sq][0]%mod;/*预处理x^(i*sqrt(n))到x^n*/
}
inline int ask(int x){
return base[x%sq][0]*base[x/sq][1]%mod;
}
}lp;

浙公网安备 33010602011771号