首先对于当前栈里面最大的数是i,那么我们设投中i的概率是p1,投中i+1的概率是p2
设不断往下投,能够投中i+1而不投中后面的数的概率为t,那么就有p1*t+p2=t,因此有
t=p2/(1-p1)= 图片说明

#include<iostream>
using namespace std;
typedef long long ll;
const int N=1e6+10;
const int mod=1e9+7;
ll w[N];
ll sum[N];
ll qpow(ll num,int p)
{
    num=num%mod;
    if(p==0)return 1;
    if(p==1)return num;
    ll tp=qpow(num,p/2);
    tp=(tp*tp)%mod;
    if(p%2==0)return tp;
    return (tp*num)%mod;
}
int main ()
{
   // ios::sync_with_stdio(0);
    //cin.tie(0);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>w[i];
    for(int i=n;i>=1;i--)sum[i]=sum[i+1]+w[i];
    ll ans=1;
    for(int i=2;i<=n;i++){
        ans=ans*((w[i]*qpow(sum[i],mod-2))%mod)%mod;
    }
    cout<<ans<<endl;
}