• 1523A. Game of Life">1523A. Game of Life
  • 1523B. Lord of the Values">1523B. Lord of the Values
  • 1523C. Compression and Expansion">1523C. Compression and Expansion
  • 1523E. Crypto Lights">1523E. Crypto Lights

    补题链接:Here

    1523A. Game of Life

    生命游戏定义

    本题中改编为一维坐标上的生命游戏


    即使 Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图1#card=math&code=m%28m%5Cin%5B1%2C1e9%5D%29) 的范围很大,但每次进化不会超过 Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图2 次,因为如果我们进化结果与上一代是相同的则说明游戏结束了,但我们只有 Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图3 格。所以最多进行 Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图4 次进化迭代

    所以我们可以直接模拟进化过程

    时间复杂度:Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图5#card=math&code=%5Cmathcal%7BO%7D%28n%5E2%29)

    1. void solve() {
    2. int n; ll m;
    3. string s;
    4. cin >> n >> m >> s;
    5. s = "0" + s + "0";
    6. while (m--) {
    7. string t = s;
    8. for (int i = 1; i <= n; ++i)
    9. t[i] |= s[i - 1] ^ s[i + 1];
    10. if (t == s)break;
    11. s = t;
    12. }
    13. cout << s.substr(1, n) << "\n";
    14. }

    1523B. Lord of the Values

    现有两种操作:选定两个元素(Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图6#card=math&code=i%5Cnot%3Dj%5C%20%5Cin%281%2Cn%29) ) ,Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图7 并且 Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图8 为偶数

    1. Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图9
    2. Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图10

    现在希望执行最多 Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图11 次操作使得 Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图12


    这里读者可以手写模拟一下,要将任何一对数字 Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图13#card=math&code=%28a%2Cb%29) 转换为一对 Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图14#card=math&code=%28-a%2C-b%29) ,可以执行一系列操作,例如 Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图15#card=math&code=%281%2C2%2C1%2C2%2C1%2C2%29),同时 Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图16 为偶数,所以我们可以直接对 Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图17#card=math&code=%281%2Cn%29) 的元素如上操作

    时间复杂度:Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图18#card=math&code=%5Cmathcal%7BO%7D%28n%29)

    1. using ll = long long;
    2. void solve() {
    3. int n; cin >> n;
    4. vector<ll>a(n + 1);
    5. for (int i = 1; i <= n; ++i)cin >> a[i];// 这里可以不用存,伪读入即可
    6. cout << n * 3 << '\n';
    7. for (int i = 1; i <= n; i += 2) {
    8. cout << "1 " << i << " " << i + 1 << '\n';
    9. cout << "2 " << i << " " << i + 1 << '\n';
    10. cout << "1 " << i << " " << i + 1 << '\n';
    11. cout << "2 " << i << " " << i + 1 << '\n';
    12. cout << "1 " << i << " " << i + 1 << '\n';
    13. cout << "2 " << i << " " << i + 1 << '\n';
    14. }
    15. }

    1523C. Compression and Expansion

    有一个任务表,其中任务里也会嵌套任务,现在由于某些原因任务表出现问题,需要由我们恢复

    发现输入的是标题末尾数字,要将完整标题输出。


    这道题需要用 STL 构建堆栈。

    在堆栈中维护列表的当前深度。 最初堆栈是空的。 对于每个新的 Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图19,有两个选项:

    • Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图20: 我们只需将给定的数字添加到堆栈的末尾,它将指向列表中的一个新子项。
    • Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图21: 我们需要找到子项,它的最后一个数字将比 Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图22 小 1。 为此,我们将从堆栈中删除最后一个元素,直到找到这个数字。

    在每次迭代结束后,我们将打印结果堆栈作为列表中的新项目。 请注意,由于输出整个列表,复杂度将是二次的。

    时间复杂度:Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图23#card=math&code=%5Cmathcal%7BO%7D%28n%5E2%29)

    1. void solve() {
    2. int n; cin >> n;
    3. vector<int>a;
    4. for (int i = 0, x; i < n; ++i) {
    5. cin >> x;
    6. if (x > 1) {
    7. while (!a.empty() && a.back() + 1 != x)
    8. a.pop_back();
    9. assert(!a.empty());
    10. a.pop_back();
    11. }
    12. a.push_back(x);
    13. for (int j = 0; j < (int) a.size(); j++) {
    14. if (j > 0) {
    15. cout << ".";
    16. }
    17. cout << a[j];
    18. }
    19. cout << '\n';
    20. }
    21. }

    1523E. Crypto Lights


    概率证明题

    让我们考虑设备的所有状态,其中 p 灯打开,以及当前算法尚未完成工作的时间。 我们将检查 p 从 1 到 n 的所有值。

    请注意,对于 p 灯打开的状态,到达该状态的概率为 Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图24…(n-p-1)%7D#card=math&code=%5Cfrac%7Bp%21%7D%7Bn%2A%28n-1%29…%28n-p-1%29%7D) 。 现在对于 p 的新值,我们需要计算拟合状态的数量。 如果没有灯光之间距离为 k 的条件,这个数字将等于将灯光分成 p 组的方法数,即 Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图25#card=math&code=C%28n-1%2Cp-1%29)

    接下来我们可以注意到,每个组还必须包含 Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图26 个元素以提供必要的距离。 那么选择组排列所需的“空闲”单元的数量将是 Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图27%E2%8B%85(p-1)#card=math&code=n-%28k-1%29%E2%8B%85%28p-1%29)。 那么最终的排列数量将是 Deltix Round, Spring 2021 (open for everyone, rated, Div. 1   Div. 2) - 图28%E2%8B%85(p-1)%2Cp-1)#card=math&code=C%28n-%28k-1%29%E2%8B%85%28p-1%29%2Cp-1%29)。 这些数量的最终总和乘以获得每个数量的概率就是答案。

    1. using ll = long long;
    2. const int N = 1e5 + 10, P = 1e9 + 7;
    3. ll n, k, ans, fac[N], inv[N];
    4. ll qpow(ll a, ll b) {
    5. ll ans = 1;
    6. for (; b; b >>= 1, a = a * a % P)
    7. if (b & 1) ans = ans * a % P;
    8. return ans;
    9. }
    10. void initC() {
    11. fac[0] = 1;
    12. for (int i = 1; i <= n; i++) fac[i] = fac[i - 1] * i % P;
    13. inv[n] = qpow(fac[n], P - 2);
    14. for (int i = n; i >= 1; i--) inv[i - 1] = inv[i] * i % P;
    15. }
    16. ll C(ll n, ll m) {
    17. if (n < m) return 0;
    18. return fac[n] * inv[m] % P * inv[n - m] % P;
    19. }
    20. void solve() {
    21. cin >> n >> k;
    22. initC();
    23. ans = 1;
    24. for (int i = 1; (i - 1) * (k - 1) <= n; ++i)
    25. ans = (ans + C(n - (i - 1) * (k - 1), i) * qpow(C(n, i), P - 2) % P) % P;
    26. cout << ans << "\n";
    27. }