解题思路:
已知
n,k
n
,
k
和长度为n的数列
ai
a
i
,对每个
1≤i≤n
1
≤
i
≤
n
,求
∑j=1i(∑l=jia[l])k
∑
j
=
1
i
(
∑
l
=
j
i
a
[
l
]
)
k
。
1≤n≤500000,1≤k≤100
1
≤
n
≤
500000
,
1
≤
k
≤
100
解题思路:
设
si
s
i
为后缀和,则:
ansi=∑j=1i(sj−si+1)k=∑j=1i∑l=0k(kl)(−1)lsli+1sk−lj=∑l=0k(kl)(−1)lsli+1∑j=1isk−lj
a
n
s
i
=
∑
j
=
1
i
(
s
j
−
s
i
+
1
)
k
=
∑
j
=
1
i
∑
l
=
0
k
(
k
l
)
(
−
1
)
l
s
i
+
1
l
s
j
k
−
l
=
∑
l
=
0
k
(
k
l
)
(
−
1
)
l
s
i
+
1
l
∑
j
=
1
i
s
j
k
−
l
预处理一下即可做到
O(nk)
O
(
n
k
)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int getint()
{
int i=0,f=1;char c;
for(c=getchar();(c!='-')&&(c<'0'||c>'9');c=getchar());
if(c=='-')c=getchar(),f=-1;
for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
const int N=500005,K=105,mod=1e9+7;
int n,k;
int a[N],s[N],c[K][K],ss[N][K];
int main()
{
//freopen("lx.in","r",stdin);
n=getint(),k=getint();
for(int i=1;i<=n;i++)a[i]=getint();
for(int i=n;i;i--)s[i]=(s[i+1]+a[i])%mod;
for(int i=1;i<=n;i++)
for(int j=0,tmp=1;j<=k;j++,tmp=1ll*tmp*s[i]%mod)
ss[i][j]=(ss[i-1][j]+tmp)%mod;
for(int i=0;i<=k;i++)
{
c[i][0]=1;
for(int j=1;j<=i;j++)
c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
}
for(int i=1;i<=n;i++)
{
int ans=0;
for(int j=0,tmp=1;j<=k;j++,tmp=1ll*tmp*s[i+1]%mod)
ans=(ans+1ll*((j&1)?mod-1:1)*c[k][j]%mod*tmp%mod*ss[i][k-j]%mod)%mod;
printf("%d ",ans);
}
return 0;
}