快速幂 & 光速幂 科技
快速幂 & 光速幂 科技
快速幂
单次查询复杂度 \(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;
}
没了。
本文来自博客园,作者:CCComfy,转载请注明原文链接:https://www.cnblogs.com/cccomfy/p/17770574.html