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';
        }
    }
}
posted @ 2025-05-30 21:00  NeeDna  阅读(10)  评论(0)    收藏  举报