P12518「MSTOI-R1」Easy question 题解
题目链接
由于我们在操作时需要用到区间和以及区间次方和,而
对于操作 1,直接输出预处理的一次方区间和
对于操作 2,直接输出预处理的
对于操作 3,我们考虑将式子拆开。
再使用预处理的
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const int N=1e6+100,K=25;
const ll MOD=998244353;
int n,q,op;
ll a[N],s[N][K],u,v,w,ans;
int main()
{
//freopen("data1.in","r",stdin);
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
s[i][0]=1;
for(int j=1;j<=20;j++) s[i][j]=s[i][j-1]*a[i]%MOD;
for(int j=1;j<=20;j++)
{
s[i][j]=(s[i][j]+s[i-1][j])%MOD;
//printf("%d %d %lld\n",i,j,s[i][j]);
}
}
while(q--)
{
scanf("%d%lld%lld",&op,&u,&v);
if(op==1) ans=(s[v][1]+MOD-s[u-1][1])%MOD;
else if(op==2)
{
scanf("%d",&w);
ans=(s[v][w]+MOD-s[u-1][w])%MOD;
}
else ans=((v-u+1)*(s[v][2]+MOD-s[u-1][2])%MOD+MOD-(s[v][1]+MOD-s[u-1][1])%MOD*(s[v][1]+MOD-s[u-1][1])%MOD)%MOD;
printf("%lld\n",ans);
}
return 0;
}