大佬 (数学)

这个题最难的是统计区间最大值。

根据数学上正难则反,求啥设啥的原则,我们不妨设区间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 }
View Code
原文地址:https://www.cnblogs.com/hzoi-kx/p/11266768.html