P12518 「MSTOI-R1」Easy question
P12518\(\mathbf{} \begin{Bmatrix} \frac{{\Large LUOGU-P12518} }{{\color{Red}\Large Solution} }\mathbf{} {No.15} \end{Bmatrix}\times{}\) NeeDna
操作一过于简单不讲解。
操作二因为 \(k \le 20\) 所以预处理。
操作三:
\((r - l + 1) \cdot \sum_{i = l}^{r} \left(a_i - \overline{a}\right)^2 = (r - l + 1) \cdot \sum_{i = l}^{r} a_i^2 - \left( \sum_{i = l}^{r} a_i \right)^2\)
所以维护的点可以在 \(k=2\) 和 \(k=1\) 的前缀和中直接处理出来。
ac code:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int M=998244353,N=1e6+10,K=20;
ll n,q,a[N],p[K+1][N];
int main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++)cin>>a[i];
for(int k=1;k<=K;k++)
for(int i=1;i<=n;i++){
ll t=1;
for(int j=1;j<=k;j++)t=t*a[i]%M;
p[k][i]=(p[k][i-1]+t)%M;
}
while(q--){
int o,l,r,k;
cin>>o>>l>>r;
if(o==1)cout<<(p[1][r]-p[1][l-1]+M)%M<<'\n';
else if(o==2){
cin>>k;
cout<<(p[k][r]-p[k][l-1]+M)%M<<'\n';
}else{
ll m=r-l+1,s1=(p[1][r]-p[1][l-1]+M)%M,s2=(p[2][r]-p[2][l-1]+M)%M;
cout<<(s2*m%M-s1*s1%M+M)%M<<'\n';
}
}
}

浙公网安备 33010602011771号