题意
给定 和长度为
的序列
,求:
$$
\sum_{1\le l\le r\le n} (\sum_{l\le i\le r}A_i)^k
$$
思路
DP+推式子+二项式定理。
假设:
$$
S_i=\sum_{i=1}^n A_i
$$
$$
f_{i,B}=\sum_{l=1}^i(S_i-S_{l-1})\\
=\sum_{l=1}^{i-1}(S_i-S_{l-1})^B+(S_i-S_{i-1})^B\\
=\sum_{l=1}^{i-1}(S_{i-1}-S_{l-1}+A_i)^B+A_i^B\\
$$
即答案为:
$$
\sum_{i=1}^n f_{i,B}
$$
由二项式定理,得:
$$
\sum_{l=1}^{i-1}(S_{i-1}-S_{l-1}+A_i)^B\\
=\sum_{l=1}^{i-1}\sum_{k'=0}^B\text{C}^{k'}_BA_i^{(B-k')}(S_{i-1}-S_{l-1})^{k'}\\
=\sum_{k'=0}^B\text{C}^{k'}_BA_i^{(B-k')}\sum_{l=1}^{i-1}(S_{i-1}-S_{l-1})^{k'}\\
=\sum_{k'=0}^B\text{C}^{k'}_BA_i^{(B-k')}f_{i-1,k'}\\
$$
计算 :
$$
f_{i,B}\\
=\sum_{l=1}^{i-1}(S_{i-1}-S_{l-1}+A_i)^B+A_i^B\\
=\sum_{k'=0}^B\text{C}^{k'}_BA_i^{(B-k')}f_{i-1,k'}+A_i^B\\
$$
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MOD=998244353;
int c[15][15];
int f[200010][15];
int a[200010];
void Inital(){
c[0][0]=1;
for(int i=1;i<=12;i++){
for(int j=0;j<=i;j++){
c[i][j]=c[i-1][j]+c[i-1][j-1];
c[i][j]%=MOD;
}
}
}//求组合数 C(i,j)
int mypow(int x,int y){
if(y==0)return 1ll;
int k=mypow(x,y/2);
if(y%2==0)return k*k%MOD;
else return k*k%MOD*x%MOD;
}
signed main(){
Inital();
int n,k;
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
f[1][0]=1;
for(int i=1;i<=k;i++){
f[1][i]=f[1][i-1]*a[1]%MOD;
}
for(int i=2;i<=n;i++){
f[i][0]=i;
for(int B=1;B<=k;B++){
for(int kp=0;kp<=B;kp++){
f[i][B]+=c[B][kp]*mypow(a[i],B-kp)%MOD*f[i-1][kp]%MOD;
f[i][B]%=MOD;
}
f[i][B]+=mypow(a[i],B);
f[i][B]%=MOD;
}
}
int ans=0;
for(int i=1;i<=n;i++){
ans+=f[i][k];
ans%=MOD;
}
printf("%lld\n",ans);
return 0;
}