HZOJ 大佬(kat)

及其水水水的假期望(然而我已经被期望吓怕了……)。

数据范围及其沙雕导致丢掉5分……

因为其实每天的期望是一样的,考虑分开。

f[i][j]表示做k道题,难度最大为j的概率。

则f[i][j]=(f[i-1][j])*(j-1)*tem+q[j]*tem;q为前缀和,tem为分母。

ps.if(k>n){puts("0");return 0;}

 

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #define MAXN 510
 5 #define LL long long
 6 #define ma(x,y) memset(x,y,sizeof(x))
 7 using namespace std;
 8 const int mod=1e9+7;
 9 int n,m,k;
10 LL wt[MAXN];
11 LL sum;
12 LL f[MAXN][MAXN];
13 LL q[MAXN];
14 LL poww(LL a,int b,int mod)
15 {
16     LL ans=1;
17     while(b)
18     {
19         if(b&1)ans=ans*a%mod;
20         a=a*a%mod;
21         b=b>>1;
22     }
23     return ans;
24 }
25 inline int read();
26 signed main()
27 {
28 //    freopen("in.txt","r",stdin);
29 //    freopen("1.out","w",stdout);
30 
31     n=read();m=read();k=read();
32     if(k>n){puts("0");return 0;}
33     for(int i=1;i<=m;i++)wt[i]=read(),sum+=wt[i];
34     if(k==1)
35     {
36         LL tem=sum%mod*poww(m,mod-2,mod)%mod;
37         printf("%lld\n",tem*n%mod);
38         return 0;
39     }
40     f[0][0]=1;
41     LL tem=poww(m,mod-2,mod);
42     for(int j=0;j<=m;j++)q[j]=1;
43     for(int i=1;i<=k;i++)
44     {
45         for(int j=1;j<=m;j++)
46             f[i][j]=(f[i-1][j]*(j-1)%mod*tem%mod+q[j]*tem%mod)%mod;
47         q[0]=0;
48         for(int j=1;j<=m;j++)
49             q[j]=(q[j-1]+f[i][j])%mod;
50     }
51     LL ans=0;
52     for(int i=1;i<=m;i++)ans=(ans+f[k][i]*wt[i]%mod)%mod;
53     printf("%lld\n",ans*(n-k+1)%mod);
54 }
55 inline int read()
56 {
57     int s=0;char a=getchar();
58     while(a<'0'||a>'9')a=getchar();    
59     while(a>='0'&&a<='9'){s=s*10+a-'0';a=getchar();}
60     return s;
61 }
View Code

 

posted @ 2019-07-30 21:02  Al_Ca  阅读(183)  评论(0编辑  收藏  举报
ヾ(≧O≦)〃嗷~