及其水水水的假期望(然而我已经被期望吓怕了……)。
数据范围及其沙雕导致丢掉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 }