快速幂 & 光速幂 科技

快速幂 & 光速幂 科技

快速幂

单次查询复杂度 \(O(\log n)\) 不需要预处理,不多说了

\(\log a\) 计算 \(x^a\):

const int mod=998244353;
il int fast_pow(int x,int a){
    int ans=1;
    while(ans){
        if(a&1)ans=(1ll*ans*x)%mod;
        x=(1ll*x*x)%mod;
        a>>=1;
    }
    return ans;
}

光速幂

预处理复杂度 \(O(\sqrt n)\),单次查询复杂度 \(O(1)\)

我们预处理:

  • \(f_1(i)=x^i,i \leq \sqrt n\)
  • \(f_2(i)=x^{i\sqrt n},i \leq \sqrt n\)

可以得到

\[\begin{aligned} x^k & = x^{\left\lfloor\frac{k}{\sqrt n}\right\rfloor\times\sqrt n +k\%\sqrt n}\\ & = (x^{\left\lfloor\frac{k}{\sqrt n}\right\rfloor\times\sqrt n} )\times (x^{k\%\sqrt n})\\ & = f_2[k/ \sqrt n]\times f_1[k \% \sqrt n] \end{aligned} \]

const int N=32000;//sqrt(1e9)
const int mod=998244353;
int f1[N+10],f2[N+10];
int light_pow(int x){
    return (1ll*f1[x%N]*f2[x/N])%mod;
}
int main(){
    int p;
    cin>>p;
    f1[0]=f2[0]=1;
    for(int i=1;i<=N;i++) f1[i]=(1ll*p*f1[i-1])%mod;
    for(int i=1;i<=N;i++) f2[i]=(1ll*f1[N]*f2[i-1])%mod;
}

没了。

posted @ 2023-10-17 20:15  CCComfy  阅读(35)  评论(0编辑  收藏  举报