首先根據數據范圍,可以判斷基本上是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 }
?