光速幂

namespace GSM{
    int pw1[N],pw2[N],p;
    void init(){
        pw1[0]=1;for(int i=1;i<=len;i++)pw1[i]=1ll*pw1[i-1]*2%p;
        pw2[0]=1;for(int i=1;i<=N/len;i++)pw2[i]=1ll*pw2[i-1]*pw1[len]%p;
    }
    int gsm(int k){
        // cout<<"gsm "<<k<<' '<<p<<' '<<1ll*pw1[k%len]*pw2[k/len]%p<<'\n';
        return 1ll*pw1[k%len]*pw2[k/len]%p;
    }    
}

复杂度 \(O(\sqrt n)-O(1)\)。注意是特定底数。上面的例子是 2。
预处理 \(2^{1\dots \sqrt n}\)\(2^{\sqrt n\dots n}\) 即可。

posted @ 2025-09-08 22:05  all_for_god  阅读(16)  评论(0)    收藏  举报