列表

详情


NC18389. 收益

描述

小N是一家金融公司的项目经理。他准备投资一个项目,这个项目要融资L元,融资成功后会得到M元的利润。现在有n个客户。对于第i个客户,他有mi元钱。小N承诺假如最后筹够钱,会给这名客户mi x ri的分红。小L通过迷之手段,估计出这个客户最后愿意出钱的概率为pi。 注意,假如公司最后筹够钱,但最终给客户分红比赚的多,他还是需要分出这么多的钱(相当于亏钱了)。现在小L想知道,按前面这样说的去做,公司最后期望能赚多少钱(有可能是负数)。

输入描述

第一行三个个整数n, L, M。
接下来n行,每行三个整数mi, Ri, Pi. 其中.
数据保证0 ≤ n ≤ 100, , 0 ≤ L,M ≤ 100000。
0 ≤ ri, pi ≤ 100

输出描述

一行一个整数代表公司最后期望收益对109 + 7取模的值。一个分数对109+7取模的值,相当于A乘上B的逆元再对109+7取模。

示例1

输入:

4 89 88
99 16 80
76 1 6
81 16 70
37 3 96

输出:

880839106

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 870ms, 内存消耗: 16096K, 提交时间: 2018-09-01 18:48:23

#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);
}

C++11(clang++ 3.9) 解法, 执行用时: 539ms, 内存消耗: 4292K, 提交时间: 2018-08-31 19:48:58

#include<bits/stdc++.h>
using namespace std;
#define MAXN 105
#define ll long long
#define P 1000000007
int n,m,x,y,i,j,ans,a[MAXN],b[MAXN],c[MAXN],f[500005],g[500005];
int main()
{
	scanf("%d%d%d",&n,&x,&y);
	for(i=1;i<=n;i++)
	{
		scanf("%d%d%d",a+i,b+i,c+i);
		b[i]=b[i]*570000004LL%P;
		c[i]=c[i]*570000004LL%P;
		m+=a[i];
	}
	for(f[0]=i=1;i<=n;i++)for(j=m;~j;j--)if(j>=a[i])
	{
		g[j]=((ll)(P+1-c[i])*g[j]+(g[j-a[i]]+(ll)f[j-a[i]]*a[i]%P*(b[i]+1))%P*c[i])%P;
		f[j]=((ll)(P+1-c[i])*f[j]+(ll)c[i]*f[j-a[i]])%P;
	}
	else
	{
		g[j]=(ll)(P+1-c[i])*g[j]%P;
		f[j]=(ll)(P+1-c[i])*f[j]%P;
	}
	for(i=x;i<=m;i++)ans=(ans+P-g[i]+(ll)f[i]*(y+i))%P;
	cout<<ans<<endl;
	return 0;
}

上一题