选出每个区间,计算每个区间权重的平均值,的期望。
si为i 的前缀和 ,inv为逆元,inv_sum为逆元前缀和。故对于每一个区间。会有:
草图,当n等于4的时候
跑一边循环就可以算出权值和,再和个数的逆元相乘就可以得到答案
代码:
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const double eps = 1e-4;
const int mod = 1e9+7;
const int N = 1000010;
int sum[N],inv_sum[N];
int qmi(int a,int b){
int res = 1;
while(b){
if(b&1) res = res*a%mod;
a = a*a%mod;
b >>= 1;
}
return res;
}
signed main(){
IOS;
#ifdef ddgo
freopen("C:/Users/asus/Desktop/ddgoin.txt","r",stdin);
#endif
for(int i=1;i<N;i++)
inv_sum[i] = (inv_sum[i-1]+qmi(i,mod-2))%mod;
int tt; cin>>tt;
while(tt --){
int n,ans = 0; cin>>n;
for(int i=1;i<=n;i++) cin>>sum[i],sum[i] = (sum[i]+sum[i-1])%mod;
for(int i=1;i<=n;i++)
ans = (ans + sum[i]*(inv_sum[i]-inv_sum[n-i])%mod)%mod;
ans = ans*qmi((n*(n+1)/2)%mod,mod-2)%mod;
cout<<(ans+mod)%mod<<endl;
}
return 0;
}