zoukankan      html  css  js  c++  java
  • AtCoder Beginner Contest 172 (C题前缀和 + 二分,D题筛因子,E题容斥定理)

    AB水题,

    C - Tsundoku

    题目描述

    有两摞书,一摞有 $n$ 本,从上至下每本需阅读 $a_i$ 分钟,一摞有 $m$ 本,从上至下每本需阅读 $b_i$ 分钟,问最多能在 $k$ 分钟内读多少本书。


    挺明显的前缀和处理,枚举从第一摞书中读多少本,余下的时间用二分查找能在第二摞书中读多少本。

    ll n, m, k, a[1 << 18], b[1 << 18];
    int main() {
        cin.tie(nullptr)->sync_with_stdio(false);
        cin >> n >> m >> k;
        for (int i = 1; i <= n; ++i) cin >> a[i], a[i] += a[i - 1];
        for (int i = 1; i <= m; ++i) cin >> b[i], b[i] += b[i - 1];
        ll cnt = 0;
        for (ll i = 0; i <= n; ++i)
            if (k >= a[i]) cnt = max(cnt, upper_bound(b + 1, b + m + 1, k - a[i]) - b - 1 + i);
        cout << cnt;
    }
    

    D - Sum of Divisors

    题目描述

    设 $f_{(x)}$ 为 $x$ 正因子个数,计算 $sumlimits_{i = 1}^n i imes f_{x}$


    先筛出每个数的 (f_{(x)}) 然后累加起来

    const int N = 1e7 + 10;
    ll a[N], n ,cnt;
    int main() {
        cin.tie(nullptr)->sync_with_stdio(false);
        cin >> n;
        for (int i = 1; i <= n; ++i) for (int j = i; j <= n; j += i) a[j] += 1;
        for (int i = 1; i <= n; ++i) cnt += i * a[i];
        cout << cnt;
    }
    

    E - NEQ

    题目描述

    给出 $n,m$ 计算有多少个大小为 $n$ 的子序列 $a,b$ 满足以下条件
    1.$1 le a_i,b_i le m$
    2.$a_i ot= a_j if i ot= j$
    3.$b_i ot= b_j if i ot= j$
    4.$a_i ot= b_i$


    没想出来,参考了一下其他的思路:

    [A_m^n(sum_{i = 0}^n(-1)^iC_n^iA_{m - i}^{n - i}) ]

    • (A_m^n)(m) 个数排 (n) 个位置,即合法的 (a)​ 的个数;
    • (sum),对于每个合法的 (a) 来说,合法的 (b) 的个数;
      • ((-1)^i),由容斥定理;
      • (C_n^iA_{m - i}^{n - i})​ ,从 (b)​ 的 (n)​ 个位置中选 (i)​ 个位置与 (a)​ 中的数相等,余下 (n−i)​ 个位置共有 (m−i) 个数可选;
        • (i = 0)(C_n^iA_{m - i}^{n-i} = A_m^n) ,即合法 (b) 的个数;
        • (ige 1)(C_n^iA_{m - i}^{n-i} = A_m^n) ,即代表对 (a) 来说不合法 (b) 的个数;
        • 所以右式即用容斥原理从合法的 (b) 中减去对 (a) 来说不合法的 (b) 的个数。
    using ll = long long;
    const int N = 5e5 + 10, mod = 1e9 + 7;
    ll fac[N];
    ll qpow(ll a, ll b) {
        ll ans = 1;
        for (; b; b >>= 1, a = a * a % mod)if (b & 1) ans = ans * a % mod;
        return ans;
    }
    void init() {
        fac[0] = 1;
        for (int i = 1; i < N; ++i) fac[i] = fac[i - 1] * i % mod;
    }
    ll inv(ll n) {return qpow(n, mod - 2);}
    ll A(ll n, ll m) {return fac[n] * inv(fac[n - m]) % mod;}
    ll C(ll n, ll m) {return fac[n] * inv(fac[m]) % mod * inv(fac[n - m]) % mod;}
    int main() {
        cin.tie(nullptr)->sync_with_stdio(false);
        init();
        int n, m; cin >> n >> m;
        ll sum = 0;
        for (int i = 0; i <= n; ++i) {
            sum += qpow(-1, i) * C(n, i) * A(m - i, n - i) % mod;
            sum = (sum + mod) % mod;
        }
        cout << A(m, n) * sum % mod;
    }
    

    The desire of his soul is the prophecy of his fate
    你灵魂的欲望,是你命运的先知。

  • 相关阅读:
    git 常用命令
    最近任务 && react文章列表
    markdown 常用格式API
    webpack 插件怎么写
    iframe
    重置浏览器滚动条css
    webpack4
    vscode插件开发
    vscode插件
    react router 的push replace
  • 原文地址:https://www.cnblogs.com/RioTian/p/15113059.html
Copyright © 2011-2022 走看看