ABC399F - Range Power Sum 题解

题意

给定 n,k 和长度为 n 的序列 A ,求:

$$
\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} :

$$
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; 
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值