【Wannafly挑战赛23 】C 收益【期望概率DP】

版权声明:将来的你一定会感谢现在努力的你!!!! https://blog.csdn.net/qq_37383726/article/details/82380112

链接:https://www.nowcoder.com/acm/contest/161/C
来源:牛客网

小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

代码

#include <map>
#include <set>
#include <queue>
#include <stack>
#include <list>
#include <string>
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define rep(i, l, r) for(int i = l; i < r; i++)
#define per(i, r, l) for(int i = r; i >= l; i--)

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int>pii;

#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
using namespace __gnu_pbds;
typedef gp_hash_table <ull, bool> HASH;
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
typedef tree<pii, null_type, less< pii >, rb_tree_tag,tree_order_statistics_node_update> rbtree;

#include <ext/rope>
using namespace __gnu_cxx;

const int N = (int) 5e5 + 11;
const int M = (int) 1e6 + 11;
const int MOD = (int) 1e9 + 7;
const double EPS = (double) 1e-9;
const double PI = (double)acos(-1.0);
const int INF = (int) 0x3f3f3f3f;
const ll INFF = (ll) 0x3f3f3f3f3f3f3f3f;

ll add(ll x, ll y){return (x += y) >= MOD ? x - MOD : x;}
ll sub(ll x, ll y){return (x -= y) < 0 ? x + MOD : x;}
void read(int &x){
    char ch = getchar(); x = 0;
    while(ch < '0' || ch > '9') ch = getchar();
    while(ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
}
/*-----------------------------------------------------------------------------------*/ 

int Pow(int a, int b, int c = MOD){
    int s = 1; a %= c;
    while(b){
        if(b & 1) s = s * 1ll * a % c;
        b >>= 1;
        a = a * 1ll * a  % c;
    }
    return s;
}
ll cnt[N], dp[N]; 
int main(){
    #ifndef ONLINE_JUDGE
        freopen("in.txt", "r", stdin);
        freopen("out.txt", "w", stdout);
    #endif
    int inv100 = Pow(100, MOD - 2);
    //cout << inv100 << "\n";
    int n, L, M; cin >> n >> L >> M;
    vector<int>m(n), r(n), p(n), rp(n);
    rep(i, 0, n){
        cin >> m[i] >> r[i] >> p[i];    
        p[i] = p[i] * 1ll * inv100 % MOD;
        rp[i] = (1 - p[i] + MOD) % MOD; 
        r[i] = r[i] * 1ll * inv100 % MOD;
    }       
    int MAX = 500000 + 5;
    cnt[0] = 1;
    rep(i, 0, n){
        int w = m[i] * 1ll * r[i] % MOD;
        per(j, MAX - 2, 0){
            cnt[j] = cnt[j] * 1ll * rp[i] % MOD + (j >= m[i] ? cnt[j - m[i]] : 0) * 1ll * p[i] % MOD; 
            if(cnt[j] >= MOD) cnt[j] -= MOD;
            dp[j] = dp[j] * 1ll * rp[i] % MOD + (j >= m[i] ? dp[j - m[i]] : 0) * 1ll * p[i] % MOD + (j >= m[i] ? cnt[j - m[i]] : 0) * 1ll * w % MOD * p[i] % MOD;
            if(dp[j] >= MOD) dp[j] -= MOD;          
        }
    }

    ll ans = 0;
    rep(i, L, MAX -1){
        if(!cnt[i]) continue;
        ans = add(ans, sub(cnt[i] * 1ll * M % MOD, dp[i]));
    }
    cout << ans <<"\n";
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37383726/article/details/82380112
今日推荐