题解:P12518 「MSTOI-R1」Easy question
观察数据范围可以发现暴力肯定过不了,所以考虑预处理优化。
前缀次方和
定义二维数组
预处理时对每个位置
然后递推
这样任意次方区间和都可
对于操作 1
直接输出预处理的一次方区间和
对于操作 2
直接输出预处理的
对于操作 3
我们考虑将式子化简。
令区间长度
记
因此
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MOD=998244353;
ll s[25][1000010];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++){
ll x;
cin>>x;
ll p=x%MOD;
s[1][i]=(s[1][i-1]+p)%MOD;
for(int j=2;j<=20;j++)
{
p=(p*x)%MOD;
s[j][i]=(s[j][i-1]+p)%MOD;
}
}
while(q--)
{
int op,l,r,k;
cin>>op>>l>>r;
if(op==1){
ll ans=s[1][r]-s[1][l-1];
if(ans<0) ans+=MOD;
cout<<ans<<"\n";
}else{
if(op==2){
cin>>k;
ll ans=s[k][r]-s[k][l-1];
if(ans<0) ans+=MOD;
cout<<ans<<"\n";
}
else{
ll m=r-l+1,U=s[1][r]-s[1][l-1],V=s[2][r]-s[2][l-1];
if(U<0) U+=MOD;
if(V<0) V+=MOD;
ll ans=(m*V%MOD-(U*U%MOD))%MOD;
if(ans<0) ans+=MOD;
cout<<ans<<"\n";
}
}
}
return 0;
}