题目大意
题解
代码
#include<cstdio>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
typedef long long LL;
const int maxn=2005;
const LL mo=1e9+7;
int n,w[maxn];
LL sumw,prow=1;
LL fac[maxn],ny[maxn],f[maxn][maxn];
LL mi(LL x,LL y)
{
LL re=1;
for(; y; y>>=1, x=x*x%mo) if (y&1) re=re*x%mo;
return re;
}
void Pre()
{
fac[0]=ny[0]=1;
fo(i,1,n) fac[i]=fac[i-1]*i%mo;
ny[n]=mi(fac[n],mo-2);
fd(i,n-1,1) ny[i]=ny[i+1]*(i+1)%mo;
f[0][0]=1;
fo(i,1,n)
fo(j,0,i)
{
f[i][j]=f[i-1][j];
if (j) (f[i][j]+=f[i-1][j-1]*w[i])%=mo;
}
}
int main()
{
scanf("%d",&n);
fo(i,1,n)
{
scanf("%d",&w[i]);
if (!w[i]) {printf("0\n"); return 0;}
(sumw+=w[i])%=mo;
(prow*=w[i])%=mo;
}
Pre();
LL ans=0;
fo(k,0,n-2) (ans+=f[n][k]*mi(sumw,n-2-k)%mo*ny[n-2-k])%=mo;
printf("%lld\n",ans*prow%mo*fac[n-2]%mo);
}