题意:
一个序列a,做k次下列操作:
1、随机一个下标
x
x
x,答案加上
Π
i
=
1
,
i
!
=
x
n
a
i
\Pi_{i=1,i!=x}^na_i
Πi=1,i!=xnai
2、将
a
x
a_x
ax减一。
求答案的期望。
题解:
感受一下,可以发现答案是这个
Π
a
i
−
Π
(
a
i
−
b
i
)
\Pi a_i-\Pi(a_i-b_i)
Πai−Π(ai−bi)
其中
b
i
b_i
bi表示
i
i
i被减了几次。
那么设
F
i
(
x
)
F_i(x)
Fi(x)表示
a
[
i
]
a[i]
a[i]被减去
b
[
i
]
b[i]
b[i]之后对答案的贡献
F
i
(
x
)
=
∑
j
>
0
(
a
i
−
j
)
x
j
j
!
F_i(x)=\sum_{j>0}\frac{(a_i-j)x^j}{j!}
Fi(x)=j>0∑j!(ai−j)xj
整体还要乘
k
!
k!
k!,除阶乘就可以除额外去贡献
F
i
(
x
)
=
(
a
i
−
x
)
e
x
F_i(x)=(a_i-x)e^x
Fi(x)=(ai−x)ex
这个可以用泰勒展开验证
F
(
x
)
=
e
n
x
Π
i
=
1
n
(
a
i
−
x
)
F(x)=e^{nx}\Pi_{i=1}^n(a_i-x)
F(x)=enxΠi=1n(ai−x)
因为
e
n
x
=
∑
i
=
0
(
n
x
)
i
i
!
e^{nx}=\sum_{i=0}\frac{(nx)^i}{i!}
enx=∑i=0i!(nx)i,后面那部分暴力展开为
∑
i
=
0
n
c
i
x
i
\sum_{i=0}^nc_ix^i
∑i=0ncixi然后再暴力卷起来,设第i项系数为
C
i
C_i
Ci
代入得
∑
i
=
0
n
C
i
Π
j
=
k
−
i
+
1
k
j
n
i
\sum_{i=0}^nC_i\frac{\Pi_{j=k-i+1}^kj}{n^i}
∑i=0nCiniΠj=k−i+1kj
code:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#define LL long long
using namespace std;
const LL mod=1e9+7;
LL n,m,a[5010],d[5010],c[5010],k;
LL Pow(LL a,LL b)
{
LL ans=1;
while(b)
{
if(b&1) ans=ans*a%mod;
a=a*a%mod;b>>=1;
}
return ans;
}
int main()
{
scanf("%lld %lld",&n,&k);
c[0]=1;
for(LL i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
memset(d,0,sizeof(d));
for(LL j=0;j<i;j++)
{
(d[j]+=c[j]*a[i]%mod)%=mod;
(d[j+1]-=c[j])%=mod;
}
memcpy(c,d,sizeof(c));
}
LL inv=Pow(n,mod-2),num=1,ans=0;
for(LL i=0;i<=n;i++)
{
(ans+=c[i]*num%mod)%=mod;
num=num*inv%mod*(k-i)%mod;
}
ans=(c[0]-ans)%mod;
printf("%lld\n",(ans+mod)%mod);
}