[解题报告][luogu4916]魔力环
Statement
一个点数为 \(n\) 的环 (项链), 每个点可以被染成黑色或白色.
染色要求为: 恰好有 \(m\) 个点被染为黑色, 且不存在长度 \(>k\) 的黑色连续串.
考虑旋转同构, 求本质不同的的染色方案数.
\( m \le n \le 10^5, k \le 10^5\).
Solution
这里旋转就相当于置换, 本质不同的的染色方案就相当于轨道数. 那么使用 Burnside 引理, 把轨道数转化为置换的不动点数量.
这里总共有 \(n\) 个置换, 每个置换都形如
\[ \begin{Bmatrix} 1 & 2 & 3 & \cdots & n - i + 1 & n - i & \cdots & n - 1 & n \\ i & i + 1 & i + 2 & \cdots & n & 1 & \cdots & i - 2 & i - 1 \end{Bmatrix} \]
那么第 \(i\) 个置换的每个循环的长度为 \( \mathrm{lgt} = \frac{lcm(i, n)}{i} = \frac{n}{\gcd(i, n)} \), 循环的数量为 \( \mathrm{num} = \gcd(i, n) \).
所以 \(n\) 就会被分成 \(\mathrm{lgt}\) 段由 \(\mathrm{num}\) 个属于不同循环的点组成的区间 (是的这里没打错).
那么对这个 \(n\) 元环的染色就相当于对这个 \(\mathrm{num}\) 元环的染色. (因为每个循环中的颜色都必须相同.)
那么我们设 \( g(i, j) \) 为给 \(i\) 元环染上 \(m\) 个黑点的合法方案数 (不考虑循环同构).
那么我们要求的就是 (这里我们默认 \( \frac{n}{\gcd(i, n)} \mid m \).)
\[ \frac{1}{n} \sum_{i = 1}^n g(\gcd(i, n), \frac{m}{n / \gcd(i, n)}) \]
改为枚举 \(\gcd\) (默认 \( d \mid n \))
\[ \begin{aligned} \frac{1}{n} \sum_{i = 1}^n g(\gcd(i, n), \frac{m}{n / \gcd(i, n)}) &= \frac{1}{n} \sum_{d = 1}^n g(d, \frac{m}{n / d}) \sum_{i = 1}^{\frac{n}{d}} [\gcd(\frac{n}{d}, i) = 1] \\ &= \frac{1}{n} \sum_{d = 1}^n g(d, \frac{m}{n / d}) \varphi(\frac{n}{d}) \end{aligned} \]
那么现在考虑怎么求 \(g(d, \frac{m}{n / d})\).
环不好弄, 那么我们枚举最后一段黑色连续段和第一段黑色连续段的长度之和, 断环为链. 然后因为黑点和白点的数量是固定的, 所以我们可以把黑色连续段看做把若干个黑点放在白点之间. 然后每段黑色连续段长度不超过 \(k\) 的方案可以用容斥算出来.
形式化地说, 设 \( h(n, c) \) 为将 \(c\) 个黑点放进 \(n\) 个空位中的方案. 则有
\[ g(d, \frac{m}{n / d}) = \sum_{i = 0}^k (i + 1) h(d - \frac{m}{n / d} - 1, \frac{m}{n / d} - i) \]
(乘上 \((i + 1)\) 是因为要算最后一段和第一段分别放了多少个黑点.)
\[ h(n, c) = \sum_{i = 0}^{\lfloor\frac{c}{k + 1}\rfloor} (-1)^i \binom{n}{i} \binom{c - i(k + 1) + n - 1}{n - 1} \]
(最后一个组合数是用 插板法 + 可重组合 计算把 \(c - i(k + 1)\) 个黑点放进 \(n\) 个空位的方案.)
这样每次计算 \(g(d, \frac{m}{n / d})\) 的时间复杂度为 \( O(k \lfloor\frac{\frac{m}{n / d}}{k + 1}\rfloor) = O(d)\), 所以总时间复杂度为 \( O(\sigma(n)) \).
Code
|
|