https://www.nowcoder.com/acm/contest/161/C
dp[x]代表融资了x元的概率。
dv[x]代表融资了x元后要分红的期望。
赛中忘记判if(j>=m[i])了。就是一题背包。
还有for循环里还是别用LL i了,超时。已经很多次了。
#include <iostream>
#include <stdio.h>
#define LL long long
const LL N = 105;
const LL mod = 1e9+7;
LL m[N],r[N],p[N];
LL dp[2][500020];
LL dv[2][500020];
int main()
{
LL ni = 570000004;
int n,L,M;
scanf("%d%d%d",&n,&L,&M);
LL sum=0;
for(int i=1;i<=n;i++){
scanf("%lld%lld%lld",&m[i],&r[i],&p[i]);
r[i]=r[i]*ni%mod;
p[i]=p[i]*ni%mod;
sum+=m[i];
}
dp[0][0]=1;
LL k=0;
for(int i=1;i<=n;i++){
for(int j=0;j<=sum;j++){
dp[k^1][j]=(1-p[i]+mod)%mod*dp[k][j]%mod;
if(j>=m[i])
dp[k^1][j]=(dp[k^1][j]+dp[k][j-m[i]]*p[i]%mod)%mod;
dv[k^1][j]=(1-p[i]+mod)%mod*dv[k][j]%mod;
if(j>=m[i])
dv[k^1][j]=(dv[k^1][j]+(dv[k][j-m[i]]+m[i]*r[i]%mod*dp[k][j-m[i]]%mod)*p[i]%mod)%mod;
}
k=k^1;
}
LL ans=0;
for(int i=L;i<=sum;i++){
ans+=dp[k][i]*M%mod-dv[k][i]+mod;
ans%=mod;
}
printf("%lld\n",ans);
}