这个题最难的是统计区间最大值。
根据数学上正难则反,求啥设啥的原则,我们不妨设区间S的最大值为i
辣么,该区间对答案的贡献是w[i],考虑这个区间出现的可能,显然区间一开始有(n-k+1)个位置,再看对于每个位置,要用1~i填满这个长度为k区间,
显然是i^k,如果有不出现i的情况,减去即可。即i^k-(i-1)^k。
然后我们就可以推出来了=> ans=Σ(i^k-(i-1)^k)*(n-k+1)*w[i] / m^k
因为考虑的是答案贡献的所有可能,所以一定不会算重算漏
既然是所有可能,直接统计即可。
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 const int mod=1000000007; 5 int qpower(int a,int b) 6 { 7 int ans=1; 8 for(;b;b>>=1,a=1ll*a*a%mod) 9 if(b&1)ans=1ll*ans*a%mod; 10 return ans; 11 } 12 int main() 13 { 14 int n,m,k,ans=0; 15 scanf("%d%d%d",&n,&m,&k); 16 if(k>n){puts("0");return 0;} 17 for(int i=1;i<=m;i++){ 18 int a; 19 scanf("%d",&a), 20 (ans+=(1ll*a*(mod+qpower(i,k)-qpower(i-1,k))%mod*(n-k+1)%mod))%=mod; 21 } 22 cout<<1ll*ans*qpower(qpower(m,k),mod-2)%mod<<endl; 23 return 0; 24 }