2019 杭电多校 第七场

Posted wulitaotao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019 杭电多校 第七场相关的知识,希望对你有一定的参考价值。

2019 Multi-University Training Contest 7

补题链接:2019 Multi-University Training Contest 7

1001 A + B = C

题意:

给出 \(a, b, c\),求 \(x, y, z\) 满足 \(a\cdot 10^x + b\cdot 10^y = c\cdot 10^z\)\(a, b, c \le 10^100000\)

题解:

补零到 \(a, b, c\) 长度相等之后,可能的情况只有四种: \(b | (c ? a),\ b | (10 · c ? a),\ a | (c ? b),\ a | (10 · c ? b)\)

Java 写炸了。

1006 Final Exam (HDU 6651)

题意:

一次考试共有 \(n\) 道题,总分为 \(m\) 分。每道题的分数不一定,可能是 \(0\) 分,也可能是 \(m\) 分,分数一定是整数。如果一道题分数为 \(x\),那么复习这道题的时间为 \(x + 1\),现在要保证在考试中做出 \(k\) 题,求准备考试的时间最少为多少。

题解:

思维

如果做不出 \(k\) 题,那么也就是复习时间最少的 \(n ? k + 1\) 道题的难度都小于等于复习的时间。因此想要做出 \(k\) 题,只要让复习时间最少的 \(n ? k + 1\) 道题的复习时间总和 \(> m\) 即可。

也就是 \(n - k + 1\) 道题的复习时间总和为 \(m + 1\),剩下 \(k - 1\) 道题的复习时间不是最少的 \(k - 1\) 道题即可。

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

int main() 
    int T;
    cin >> T;
    while(T--) 
        ll n, m, k;
        scanf("%lld%lld%lld", &n, &m, &k);
        printf("%lld\n", m + 1 + (m / (n - k + 1) + 1) * (k - 1));
    
    return 0;

1011 Kejin Player (HDU 6656)

题意:

\(i\) 级升级到 \(i + 1\) 级需要花费 \(a_i\) RMB,成功的概率为 \(p_i = \fracr_is_i\),若失败则降到 \(x_i\) 级,然后给出 \(q\) 个询问求 \(l\) 级升级到 \(r\) 级花费的期望。

题解:

期望DP 逆元

\(g(l, r)\)\(l\) 升到 \(r\) 的期望,这种期望满足减法 \(g(l, r) = g(1, r) ? g(1, l)\)。因为升级只能一级一级升, 所以要从 \(1\) 升级到 \(r\), 必然要经过 \(l\)。可以降维,用 \(dp[i]\) 表示从 \(1\) 升到 \(i\) 的期望,则 \(g(l, r) = dp[r] ? dp[l]\)

\(dp[i]\) 转移至 \(dp[i + 1]\),假设尝试了 \(t\) 次才成功,那么也就是前面 \(t - 1\) 次都是失败的,所以下一状态的花费为当前状态的花费 + 成功的花费 + 失败的花费 + 失败后再次回到当前状态的花费。于是:

\[dp[i + 1] = dp[i] + 1 \times a[i] + (t - 1) \times a[i] + (t- 1) \times (dp[i] - dp[x_i])\]

\(\fract - 1t = 1 - \fracr_is_i\),即 \(t = \fracs_ir_i\)

于是状态转移方程为:

\[dp[i + 1] = dp[i] + \fracs_ir_i \times a[i] + (\fracs_ir_i - 1) \times (dp[i] - dp[x_i])\]

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 5e5 + 10;
const ll mod = 1e9 + 7;

ll r[maxn], s[maxn], x[maxn], a[maxn];

ll dp[maxn];

ll qmod(ll a, ll b, ll p) 
    ll ans = 1;
    while(b) 
        if(b & 1) ans = (a * ans) % p;
        a = (a * a) % p;
        b >>= 1;
    
    return ans;


int main() 
    int T;
    cin >> T;
    while(T--) 
        int n, q;
        scanf("%d%d", &n, &q);
        for(int i = 1; i <= n; ++i) 
            scanf("%lld%lld%lld%lld", &r[i], &s[i], &x[i], &a[i]);
            ll t = (s[i] * qmod(r[i], mod - 2, mod)) % mod;
            dp[i + 1] = (dp[i] + (t * a[i]) % mod + ((t - 1) * (dp[i] - dp[x[i]])) % mod + mod) % mod;
        
        for(int i = 0; i < q; ++i) 
            int l, r;
            scanf("%d%d", &l, &r);
            printf("%lld\n", (dp[r] - dp[l] + mod) % mod);
        
    
    return 0;

以上是关于2019 杭电多校 第七场的主要内容,如果未能解决你的问题,请参考以下文章

2020 杭电多校 第七场 1007(6850) Game

2020 杭电多校 第七场 1007(6850) Game

2022 年杭电多校第七场 1007 Weighted Beautiful Tree

2022 年杭电多校第七场 1007 Weighted Beautiful Tree

2022 年杭电多校第七场 1007 Weighted Beautiful Tree

2019杭电多校第九场