专栏文章
题解:P12518 「MSTOI-R1」Easy question
P12518题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mip9z306
- 此快照首次捕获于
- 2025/12/03 08:34 3 个月前
- 此快照最后确认于
- 2025/12/03 08:34 3 个月前
观察数据范围可以发现暴力肯定过不了,所以考虑预处理优化。
前缀次方和
定义二维数组
预处理时对每个位置 计算
然后递推
这样任意次方区间和都可 获得:
对于操作 1
直接输出预处理的一次方区间和 。
对于操作 2
直接输出预处理的 次方区间和 。
对于操作 3
我们考虑将式子化简。
令区间长度 ,区间一次和
记 。原式
因此
C#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;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...