ABC468E Sum of Average
赛场差点没切出来,好菜啊
题目大意
给定一个长度为 \(n\) 的数组 \(a=(a_1,a_2,...,a_n)\),定义函数 \(f(l,r)\) 为数组 \(a\) 中下标为 \([l,r]\) 的算数平均值。
现让你求出 \(\sum_{1\le l\le r\le n}f(l,r)\),即在 \(a\) 中所有非空子区间的平均值之和,结果对
\(998244353\) 取模。
分析
一道纯数学题。
考虑化简题目中的式子,对 \(\sum_{1\le l\le r\le n}f(l,r)\) 进行展开,得到 \(\sum_{1\le l\le r\le n} \sum_{i=l}^{r} \frac{a_i}{r-l+1}\),因为 \(a_i\) 是连续的一段,为了降低时间复杂度,可以使用前缀和进行优化。设 \(pre_i=\sum_{j=1}^{i}a_j\),那么 \(\sum_{i=l}^{r} {a_i}\) 可以化简为 \(pre_r-pre_{l-1}\)。所以原式就就等于 \(\sum_{l=1}^{n}\sum_{r=l}^{n} \frac{pre_r-pre_{l-1}}{r-l+1}\),这样我们就完成了第一步。
注意到原式的分母是 \(r-l+1\),此分母就相当于区间长度,我们令 \(d=r-l+1\),这样就可以把分母提出来,方便计算。因为我们必须得保证右端点 \(r\le n\),带入得 \(d+l-1\le n\),即 \(l\le n-d+1\)。所以此时我们的式子就变成了 \(\sum_{d=1}^{n}\frac{1}{d}\sum_{l=1}^{n-d+1}(pre_{l+d-1}-pre_{l-1})\)。为了方便处理 \(pre\) 数组不同的下标,我们将原式拆开,拆成:
\(\sum_{d=1}^{n}\frac{1}{d}(\sum_{l=1}^{n-d+1}pre_{l+d-1}-\sum_{l=1}^{n-d+1}pre_{l-1})\)
现在进行换元,使 \(pre\) 数组得下标相等。对于被减数的式子,我们令 \(k=l+d-1\),将 \(k\) 的取值带入不等式 \(1\le l \le n-d+1\) 中,可以解得 \(k\) 的取值范围,这个取值范围就是求和函数中的下界和上界。于是被减数的式子被我们化简成了 \(\sum_{k=d}^{n}pre_k\)。同理,我们将减数的式子化简成 \(\sum_{k=0}^{n-d}pre_k\)。将两式带入到原式中:
\(\sum_{d=1}^{n}\frac{1}{d}(\sum_{k=d}^{n}pre_k-\sum_{k=0}^{n-d}pre_k)\)
注意到原式中的 \(pre\) 数组的取值均是连续的一段,仍然用前缀和进行优化,设 \(pre'_i=\sum_{j=0}^{i}pre_i\)。则原式变为:
\(\sum_{d=1}^{n}\frac{1}{d}(pre'_n-pre'_{d-1}-pre'_{n-d})\)
这样,我们只需预处理出 \(pre\) 数组,便可以在线性复杂度内求解。但是注意,本题结果要对 \(998244353\) 取模,而公式中有除法,所以需要将除法转化为乘 \(d\) 的逆元。为了简便,可以使用快速幂来计算逆元,总体时间复杂度为 \(O(n\) \(log\) \(mod)\),足以通过本题。
实现
赛时代码,较丑勿喷
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+10,MOD=998244353;
int n,a[N],pre[N],pre2[N];
int qpow(int a,int b){
int res=1;
while(b){
if(b&1)res=res*a%MOD;
a=a*a%MOD;
b>>=1;
}
return res;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
pre[i]=pre[i-1]+a[i];pre[i]%=MOD;
}
for(int i=1;i<=n;i++){
pre2[i]=pre2[i-1]+pre[i];pre2[i]%=MOD;
}
int sum=0;
for(int d=1;d<=n;d++){//长度
int val=(pre2[n]-pre2[d-1]-pre2[n-d])%MOD;
while(val<0)val+=MOD;//必须是正数
sum=(sum+val*qpow(d,MOD-2))%MOD;
}
cout<<sum;
}

浙公网安备 33010602011771号