ARC156E
给定 \(n, m, k\),对于长度为 \(n\) 的序列 \(X\),\(X\) 是好序列当且仅当: \(0 \le X_i \le m, \sum X_i \le k\) 且存在满足以下条件的的图 \(G\):
- \(G\) 是有 \(n\) 个顶点的无向图(从 \(1\) 开始编号),不包含自环。
- \(G\) 中第 \(i\) 个点的度数为 \(X_i\)。
- \(G\) 中第 \(i\) 个点不与 \(i + 1\) 连边(\(1, n\) 不连边。)
求好序列 \(X\) 的数量对 \(998244353\) 取模的结果。
\(n, m \le 3000, k \le nm, n \ge 4\)
充要条件
还是老套路,考虑转化好序列的条间。
记 \(s = \sum X_i\),那么 \(s\) 一定是偶数,有 \(c = \frac{s}{2}\) 条边。
如果 \(G\) 没有第三个条件,只需要任意 \(X_i \le c\) 即可,随便连边都行。
加上了第三个条件,因为没有 \((i, i + 1)\),那么一定有 \(X_i + X_{i + 1} \le c\)(每条边只能占一端)。这是一个必要条件。
再从构造的角度,我们尝试边一条一条的加进去,一直满足这个必要条件。每次随便选取一个 \(X_i, X_j \ge 1\),连一条边,然后将他们减一,如果出现 \(X_i + X_{i + 1} = c\) 的情况就把剩下的边都连给 \(i, i + 1\) 即可。
所以我们就证明了这个 \(X_i + X_{i + 1} \le c\) 是 \(G\) 存在的充要条件。
计数
对于任意 \(i\) 都满足 \(X_i + X_{i + 1} \le c\),这个不好计算。考虑使用容斥原理。用总方案数 - “存在一个 \(i\),满足 \(X_i + X_{i + 1} > \frac{s}{2}\)” + "存在 \(i, j\),满足 \(X_i + X_{i + 1} > \frac{s}{2}, X_j + X_{j + 1} > \frac{s}{2}\)" \(- \dots\)
然后发现省略号中的项都是 \(0\),只需要计算这三项即可。
令 \(f = (1 + x + x^2 + \dots + x^m)^n = \frac{1 - x^{m + 1}}{1 - x}\),为每个 \(X_i\) 的生成函数。
总方案数
从 \((1)\) 推,将分子、分母都暴力展开,枚举两个指数(要求和为偶),组合数算一下系数即可。时间复杂度:\(O(n^2)\)
从 \((2)\) 推,\(O(n)\) 算出 \((1 - x^{m + 1})^n\) 的系数,并乘上 \(\frac{1}{1 - x^2}\)(\(O(k)\) 做前缀和),\(\frac{1}{(1 - x)^{n}}\) 使用牛顿二项式定理展开。最后枚举 \(\frac{(1 - x^{m + 1})^n}{1 - x^2} 或 \frac{1}{(1 - x)^n}\) 的指数,计算一下系数即可。时间复杂度:\(O(n + k)\)
存在一个 \(i\),满足 \(X_i + X_{i + 1} > \frac{s}{2}\)
不妨设 \(i = 1\),设 \(t = X_i + X_{i + 1} \le 2m\),将 \(x_1, x_2\) 以及 \(x_3 \sim x_n\) 分开计算。
枚举 \(t\),令 \(k \leftarrow \min(2t - 2, k - t)\),和总方案数一样的做法。(可以 \(O(n\max{k} = nm)\) 预处理出 \(x_3 \sim x_n\) 对应的部分 \(\frac{1}{1 - x^2}f^{n - 2}\),枚举 \(t\) 可以 \(O(1)\) 调用 \([x^k]\)
最后别忘了需要乘上 \(n\),因为钦定了 \(i = 1\)。
存在 \(i, j\),满足 \(X_i + X_{i + 1} > \frac{s}{2}, X_j + X_{j + 1} > \frac{s}{2}\)
钦定 \(1 \le i < j < n\),则一定有 \(j = i + 1\),即 \(X_1 + X_2, X_2 + X_3 > \frac{s}{2}\)。
如果枚举了 \(X_2\),\(X_1, X_3\) 对应生成函数:\(g = (x^a + x^{a + 1} + \dots + x^{m}) = x^a\frac{1 - x^{m - a + 1}}{1 - x}, a = 1 + \frac{s}{2} - X_2\)
可以枚举 \(a\),\(O(m)\) 预处理 \(g^2f^{n - 3}\)(可预先算出 \(\frac{1}{(1 - x)^2}f^{n - 3}\),然后每次乘 \(x^{2a}(1 - x^{m - a})^2\))。枚举 \(X_2\),\(O(1)\) 查询 \([x^{s - X2}]\) 即可。
时间复杂度是平方级别的,具体的懒得算了,看代码实现。
总结
小清新题目,思路还是比较明晰的,先搞出充要条件,可能容斥要想一下,然后就是神秘的分类讨论 + 生成函数题了。
写起来一堆细节,吐了。
浙公网安备 33010602011771号