[AGC028B]Removing Blocks 概率与期望

考虑算每一个位置在所有情况的期望值乘以全排列似乎就是答案.  

那么对于 $i$,如果要由 $j$ 来贡献的话就要满足 $j$ 在 $i....j-1$ 之前先拿. 

而在拿 $j$ 时,先于 $i...j-1$ 的概率就是 $\frac{1}{|j-i|+1}$  

直接对所有的 $j$ 加和,然后乘以个概率即可. 

code: 

#include <bits/stdc++.h>
#define LL long long 
#define N 100005     
#define setIO(s) freopen(s".in","r",stdin)     
using namespace std;
const LL mod=1000000007; 
LL a[N],n,inv[N],sum[N]; 
LL fac(int p) 
{
    LL ans=1ll; 
    for(int i=2;i<=n;++i) ans=ans*1ll*i%mod; 
    return ans; 
}
int main() 
{
    // setIO("input"); 
    int i,j; 
    scanf("%d",&n);
    for(i=1;i<=n;++i) scanf("%lld",&a[i]);  
    sum[1]=inv[1]=1ll; 
    for(i=2;i<=n;++i) 
    {
        inv[i]=(mod-(mod/i)*inv[mod%i]%mod)%mod; 
        sum[i]=(sum[i-1]+inv[i])%mod;   
    }
    LL ans=0ll; 
    for(i=1;i<=n;++i) 
    {
        ans=(ans+a[i]*((sum[i]-sum[0]+sum[n-i+1]-sum[1]+mod)%mod)%mod)%mod; 
    }
    printf("%lld\n",ans*fac(n)%mod);   
    return 0; 
}

  

posted @ 2019-10-28 23:23  EM-LGH  阅读(192)  评论(5编辑  收藏  举报