• 「MtOI2018」魔力环


    首先发现是经典的循环置换本质不同个数模型,根据 Burnside 引理:

    \[|X / G| = \frac{1}{|G|}\sum\limits_{g \in G} |X ^ g| \]

    考虑第 \(i\) 个置换,整个置换分为了 \((n, i)\) 个大小为 \(\frac{n}{(n, i)}\) 的循环置换,不动点数量就是每个循环置换内颜色全部相等的方案。

    那么只需要考虑每个循环置换的第一个位置,即 \(1 \sim (n, i)\) 这些位置填的方案,剩下的按周期补齐即可。

    此时对于第一个周期,他的长度为 \((n, i)\) 需要放的黑球恰好为 \(\frac{m(n, i)}{n}(\frac{n}{(n, i)} \mid m)\),注意需要满足整除的条件。

    如果 \(n \ne m\),那么问题的约数条件就等价于将第一个周期首位相接后满足题目两个要求,此时周期之间互补影响。

    否则整个环都必须要被涂黑,只需简单判定即可,以下默认 \(n \ne m\)

    于是我们记 \(f(n, m)\) 为将长度为 \(n\) 的环用恰好 \(m\) 个黑珠子,不存在长度超过 \(k\) 的黑珠子连续段的方案。

    考虑去掉环的限制,枚举首尾极长黑珠子长度之和 \(l\),有 \(l + 1\) 种方案分配给首尾段,然后钦定首段后放了一个白球,尾端前放了一个白球,就变成了一个序列问题。

    同时注意为了方便我们将 \(m \le k\) 的情况判掉(答案即 \(\binom{n}{m}\)),这样可以省去很多讨论。

    据此,我们令 \(g(n, m)\) 将长度为 \(n\) 的序列用恰好 \(m\) 个黑珠子,不存在长度超过 \(k\) 的黑珠子连续段的方案,则有 \(f\)\(g\) 的关系:

    \[f(n, m) = \sum\limits_i ^ k (i + 1)g(n - i - 2, m - i) \]

    这本质上就是将 \(m\) 个黑珠子往 \(n - m\) 个白珠子里插的问题,考虑容斥,钦定有 \(i\) 段长度超过 \(k + 1\) 的黑珠子连续段,具体做法是将 \(k + 1\) 个黑珠子捆在一起插入到白珠子不同的 \(i\) 个缝隙中。由于黑珠子之间没有标号,那么忽略之前插入过的黑珠子,剩下的球随意插入到白珠子之间,那么有:

    \[g(n, m) = \sum\limits_i ^ {\min(n - m + 1, \frac{m}{k + 1})} (-1) ^ i \binom{n - m + 1}{i} \binom{n - i * (k + 1)}{n - m} \]

    同时根据前面的推导,可知计算一次 \(f(n, m)\) 的复杂度为 \(\mathcal{O}(m)\),根据一开始的 Burnside 引理,答案为:

    \[\frac{1}{n}\sum\limits_{i = 1} ^ n [\frac{n}{(n, i)} \mid m]f\left((n, i), \frac{m}{\frac{n}{(n, i)}}\right) \]

    \(d = \frac{n}{(n, i)}\) 那么 \(\frac{n}{d} \mid n, d \mid m\),则可知 \(d\) 的取值集合至多只有 \(m\) 的所有约数,因此复杂度的一个上界是 \(\mathcal{O}(\sigma_1(m))\).

    一个经典的估界是 \(\sigma_1(m) = \mathcal{O}(m \log \log m)\) 因此可以轻松通过。


    一个变式:原问题去掉黑球个数限制,可以填任意个黑球的方案。

    同样的思路,求出 \(f(n)\) 为长度为 \(n\) 的环用若干个黑球,不存在长度超过 \(k\) 的黑球连续段的方案。

    首先还是判掉 \(n \le k\) 的情况,此时 \(f(n) = 2 ^ n\).

    更进一步地,还是令 \(g(n)\) 为长度为 \(n\) 的序列用若干个黑球,首尾必须填白球,不存在长度超过 \(k\) 的黑球连续段的方案,还是有:

    \[f(n) = \sum\limits_i ^ k (i + 1)g(n - i) \]

    对于 \(g\) 考虑 \(\rm dp\) 容斥转移,有初值 \(g(0) = g(1) = 1\),同时:

    \[g(i) = 2g(i - 1) - [i > k + 1]g(i - k - 2)(i > 2) \]

    那么最后一次填的是白球的方案就应该是 \(g(n - 1)\).

    首先可以线性预处理出所有 \(0 \sim n\)\(g\),然后直接按照上面哪个题的方法枚举约数计算,复杂度还是 \(\mathcal{O}(\sigma_1(n))\) 的。

    当然也可以用上面的哪个方法再化简也可以得到这个复杂度,只不过细节有一点多

  • 相关阅读:
    前端线上项目汇总
    gulp构建工具学习汇总
    ES6知识点汇总
    页游技术点汇总中
    前后端方案汇总
    vim常用命令
    互联网哲学
    js调试技巧汇总中
    windows下Docker安装MySQL
    RabbitMQ几个常用面试题
  • 原文地址:https://www.cnblogs.com/Go7338395/p/15686184.html
Copyright © 2020-2023  润新知