zoukankan      html  css  js  c++  java
  • CF1025G Company Acquisitions 题解

    很妙的一道题.

    解决这一类题目, 可以考虑构造 Potential function, 使得每操作一次函数的期望增加值为 (1).

    比如这道题可以构造这样一个 potential function, 对于每个点, 假设它的 followers 个数为 cnt, 那么它的函数值为 (2^{cnt}-1).
    总的函数值就是每一个人的函数值的加和.

    假设现在操作两个 followers 个数分别为 (p,q) 的人, 那么一次操作后, 我们算出这个函数的期望变化值:
    (p) follows (q): ((2^{q+1}-1)-(2^q-1)-(2^p-1)).
    (q) follows (p): ((2^{p+1}-1)-(2^p-1)-(2^q-1)).
    (frac{(2^{q+1}-1)-(2^q-1)-(2^p-1)+(2^{p+1}-1)-(2^p-1)-(2^q-1)}{2}=1).

    即每操作一次, 这个值的期望变化为 1. 那么答案即为最终的函数值 - 初始函数值.

    这种方法同样可以运用到最近的 CF1349D 上, 推导和实现过程将会比较简洁.

    #include <bits/stdc++.h>
    using namespace std;
    const int mod = 1e9 + 7;
    
    inline int fsp(int x, int p = mod - 2) {
        int res = 1;
        while (p) {
            if (p & 1) res = 1ll * res * x % mod;
            x = 1ll * x * x % mod, p >>= 1;
        }
        return res;
    }
    
    int n, cnt[555];
    
    int main() {
        cin >> n;
        for (int i = 1, x; i <= n; ++i) {
            scanf("%d", &x);
            if (~x) ++cnt[x];
        }
        int ans = 0;
        for (int i = 1; i <= n; ++i)
            ans = (ans + fsp(2, cnt[i]) - 1) % mod;
        ans = (fsp(2, n - 1) - 1 - ans + mod) % mod;
        cout << ans << endl;
        return 0;
    }
    
  • 相关阅读:
    「考试」省选27
    「考试」省选26
    「考试」省选25
    $dy$讲课总结
    「笔记」$Min\_25$筛
    「考试」省选24
    「总结」多项式生成函数例题(4)
    「总结」多项式生成函数相关(4)
    「考试」省选23
    「总结」后缀3
  • 原文地址:https://www.cnblogs.com/hnfms-jerry/p/solution_cf1025g.html
Copyright © 2011-2022 走看看