光速幂

光速幂,在 \(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;
posted @ 2022-11-20 16:15  半步蒟蒻  阅读(325)  评论(0)    收藏  举报