首先根据数据范围,可以判断基本上是n^2的复杂度
通过分析我们发现每一次都可以从m个数中任意选,既然任意选,那么此时的概率的分母就是不变的,然而题中涉及的是某一段的最大值,所以我们按套路假设
f[i][j]表示第i天,当前最大值为j的方案数,也可以是概率,
我们又发现天数是以k为一个单位的,
那么我们i从1-k枚举即可,
f[i][j]=f[i-1][j]*j(表示前一道题已经是最大值,这一道题从1-j选择)
f[i][j]=f[i-1][1---(j-1)]*1(表示当前选j,可以用前缀和维护)
这里是方案数,因为以k天为单位,所以
统计出每个f[k][i]*wt[i]*pow(pow(m,k),mod-2)的和
显然这就是k天的劳累度的期望(也可以理解为每k天的平均花费是这些)
那么求n天我们只需要看n天中有多少k,答案*(n-k+1)%mod
(顺便一提:WA95 是因为数据好像有k>n的情况,puts(0)即可,虽然数据范围说没有........)
以后做期望一定要努力推,其实想懂后真的不难
其实关于期望的题,也可以用概率或方案数去做,这题就是个假期望......
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #include<string> 7 #include<vector> 8 #define int long long 9 #define MAXN 10001 10 using namespace std; 11 int f[MAXN][MAXN]; 12 int wt[MAXN]; 13 int n,m,k; 14 int mod=1000000007; 15 int pow(int x,int y) 16 { 17 int aa=1; 18 while(y>0) 19 { 20 if(y&1) 21 { 22 aa=aa*x%mod; 23 } 24 x=x*x%mod; 25 y>>=1; 26 } 27 return aa%mod; 28 } 29 int sum[MAXN][MAXN]; 30 signed main() 31 { 32 scanf("%lld%lld%lld",&n,&m,&k); 33 if(k>n) 34 { 35 printf("0\n"); 36 return 0; 37 } 38 for(int i=1;i<=m;++i) 39 { 40 scanf("%lld",&wt[i]); 41 } 42 for(int i=1;i<=m;++i) 43 { 44 f[1][i]=1; 45 sum[1][i]=sum[1][i-1]+1; 46 } 47 for(int i=2;i<=k;++i) 48 { 49 for(int j=1;j<=m;++j) 50 { 51 f[i][j]=(f[i][j]+f[i-1][j]*j)%mod; 52 f[i][j]=(f[i][j]+sum[i-1][j-1])%mod; 53 } 54 for(int j=1;j<=m;++j) 55 { 56 sum[i][j]=(sum[i][j-1]+f[i][j])%mod; 57 } 58 } 59 int ans=0; 60 for(int i=1;i<=m;++i) 61 { 62 ans=(ans+f[k][i]*wt[i]%mod)%mod; 63 } 64 printf("%lld\n",ans*pow(pow(m,k),mod-2)%mod*(n-k+1)%mod); 65 }