2024.5 做题记录
362. CF553E Kyoya and Train
直接 dp,设 \(h_i\) 为 \(i \to n\) 的最短路,\(f_{u, i}\) 为到了点 \(u\) 用了 \(i\) 秒,还需要的最小期望花费。显然对于 \(i > t\) 有 \(f_{u, i} = h_u + x\),否则有:
显然是一个差卷积。分治 FFT 即可。
363. CF1965E Connected Cubes
智慧构造。
往每一行之间加一个空行(具体可以把这一行一直往右拖),然后每次用同一种颜色填充空行就可以了。
364. CF1172C2 Nauuo and Pictures (hard version)
和 wrx duel,结果两个人都没做出来。
这道题最妙的思想就是把每个照片拆成 \(w_i\) 个权值为 \(1\) 的小照片,那么每个小照片的地位都相等,算出每个小照片最后期望的权值再乘 \(w_i\) 就是答案。
剩下的部分随便 dp 即可。设 \(f_{i, j}\) 为前 \(i\) 次访问到了 \(j\) 个(不)被喜欢的照片的概率,\(g_{i, j}\) 为前 \(i\) 次访问到(不)被喜欢的照片中有 \(j\) 次访问到了当前的小照片的概率。转移是 trivial 的。
365. POJ3734 Blocks
考虑答案的 EGF 即为 \(\frac{(e^x + e^{-x})^2}{4} \times e^{2x} = \frac{1}{4} (e^{4x} + 2e^{2x} + 1)\),EGF 第 \(n\) 项的系数即为 \(\frac{1}{4n!} (4^n + 2 \times 2^n)\),所以答案即为 \(\frac{1}{4} (4^n + 2 \times 2^n)\)。
366. CF1967D Long Way to be Non-decreasing
考虑我们类似双指针一样维护当前的 \(a_i\),在它自增的同时一个一个 check。这样避免了类似“一个点在基环树上跳 \(k\) 步能到达的编号 \(\ge x\) 的最小点”的问题。(事实上这一步非常妙。)
那么现在只用判断“\(u\) 和 \(v\) 能否在 \(k\) 步内可达”。这是 trivial 的。维护 dfn 序,要么 \(u\) 在 \(v\) 子树内,要么 \(u\) 能跳到 \(v\) 所在环。
367. CF1967E1 Again Counting Arrays (Easy Version)
贪心地判断一个 \(a\) 是否合法:\(b_i\) 能增加就增加,不能增加就减少,这样能保证尽量使得 \(b_i \ge 0\)。
这能导出一个 dp 做法:设 \(f_{i, j}\) 为考虑到第 \(i\) 位,当前 \(b_i = j\) 的方案数。注意到一旦 \(j \ge m\) 那么后面的 \(a_i\) 就可以任选,所以这个 dp 是 \(O(nm)\) 的。
我们还可以考虑统计不合法的 \(a\)。枚举在某个位置 \(b_i = 0, a_{i + 1} = 1\)。那么前面 \(b\) 向上走的步数可以算出。
现在相当于要算 \((0, b_0)\) 走到 \((i, 0)\),并且不触碰直线 \(y = -1\) 和 \(y = m\) 的方案数。直接反射容斥(类似 UOJ424 [集训队作业 2018] count),设触碰直线 \(y = -1\) 为事件 A,触碰直线 \(y = m\) 为事件 B,那么答案即为 \(f(\varnothing) - f(A) - f(B) + f(AB) + f(BA) - f(ABA) - f(BAB) + \cdots\),\(f(x)\) 为终点依次沿 \(x\) 中直线对称后,起点到终点的方案数。这个方法的复杂度为 \(O(\frac{n^2}{m})\)。
这样我们的时间复杂度变为 \(O(\min(nm, \frac{n^2}{m})) = O(n \sqrt n)\),可过。
368. BZOJ4228 Tibbar 的后花园
条件相当于图由若干个链连通块和若干个环连通块组成,并且每个环的大小都不是 \(3\) 的倍数。
设 \(n\) 个点组成一条链的 EGF 为 \(f(x)\),组成一个环的 EGF 为 \(g(x)\),那么答案的 EGF 即为 \(e^{f(x)} \times e^{g(x)} = e^{f(x) + g(x)}\)。
直接多项式 exp 即可。时间复杂度 \(O(n \log n)\)。
369. P6936 [ICPC2017 WF] Scenery
很神奇的题,感觉还没完全搞懂。
考虑对于一个区间集合,设其最晚开始的完成时间为 \(C\),其最小区间左端点为 \(s\),那么 \((C - t, s)\) 这个区间可以被标记成 forbidden,意思是这个区间不能开始拍摄任何照片,否则这个集合的要求就没法满足(只考虑拍摄时间 \(< s\))。
所以我们的算法流程就是,从大到小枚举集合区间最小左端点,然后考虑所有可能的右端点,求出其最晚的开始时间,然后把一些区间设置为 forbidden。
时间复杂度 \(O(n^2)\)。
370. POJ1322 Chocolate
考虑答案的 EGF,就是 \(\frac{1}{2^c} (e^x + e^{-x})^{c - m} \times (e^x - e^{-x})^m\)。
二项式定理展开,得答案为 \(\frac{1}{2^c} \sum\limits_{i = 0}^{c - m} \binom{c - m}{i} \sum\limits_{j = 0}^m \binom{m}{j} (-1)^{m - j} [x^n] e^{(2i + 2j - c)x}\)。
最后答案还要乘上一些系数。
371. P10400 『STA - R5』消失的计算机
很有趣的造计算机题。
372. NC15254 白兔的刁难
单位根反演:
发现这是一个 IDFT 的形式,并且 \(k\) 还是 \(2\) 的幂,所以直接 IDFT 即可。
373. NC18393 计数
套路单位根反演。
套矩阵树定理算生成树边权之积的和即可。复杂度 \(O(k (n^3 + m))\)。
374. P5401 [CTS2019] 珍珠
题意等价于出现偶数次的变量至少有 \(t = \max(0, D - n + 2m)\) 个。
二项式反演,设 \(f_i\) 为钦定 \(i\) 个变量出现偶数次的方案数,那么:
加法卷积即可。反演回去减法卷积即可。
时间复杂度 \(O(D (\log D + \log n))\)。
375. CF891E Lust
首先一个不容易的观察:答案等于 \(\prod\limits_{i = 1}^n a_i - \frac{\sum\limits_b \prod\limits_{i = 1}^n (a_i - b_i)}{n^k}\)。重点关注后面那坨东西。
注意到 \(\sum\limits_b \prod\limits_{i \notin S} (-b_i)\) 只和 \(|S|\) 有关。设 \(|S| = t\),那么这个东西等于 \(k! [x^k] (-xe^x)^{n - t} \times e^{tx} = k! [x^k] (-x)^{n - t} e^{nx} = (-1)^{n - t} n^{k - (n - t)} \frac{k!}{(k - (n - t))!}\)。可以 \(O(n^2)\) 求出 \(f_i = \sum\limits_{|S| = i} \prod\limits_{j \in S} a_j\),然后就做完了。
376. [ABC241Ex] Card Deck Score
答案即为:
考虑生成函数,设 \(F_i(x) = \sum\limits_{j = 0}^{b_i} (a_i x)^j\)。那么答案即为 \([x^m] \prod\limits_{i = 1}^n F_i(x)\)。
考虑 \(F_i(x) = \sum\limits_{j = 0}^{b_i} (a_i x)^j = \frac{1 - (a_i x)^{b_i + 1}}{1 - a_i x}\)。分子可以 \(O(2^n)\) 枚举乘了哪一项,这样可以知道分母需要贡献 \(x\) 的多少次方。我们重点关注分母。设现在要求分母的 \(x^q\) 次项。
有一个常见套路是设 \(\sum\limits_{i = 1}^n \frac{f_i}{1 - a_i x} = \frac{1}{\prod\limits_{i = 1}^n (1 - a_i x)}\)。因为 \(\sum\limits_{i = 1}^n \frac{f_i}{1 - a_i x} = \frac{\sum\limits_{i = 1}^n f_i \prod\limits_{j \ne i} (1 - a_j x)}{\prod\limits_{i = 1}^n (1 - a_i x)}\) 所以可以列出 \(n\) 个关于 \(f_i\) 的方程,可以高斯消元求解。
那么 \([x^q] \frac{1}{\prod\limits_{i = 1}^n (1 - a_i x)} = [x^q] \sum\limits_{i = 1}^n \frac{f_i}{1 - a_i x} = \sum\limits_{i = 1}^n f_i ([x^q] \sum\limits_{j \ge 0} (a_i x)^j) = \sum\limits_{i = 1}^n f_i a_i^q\)。
总时间复杂度 \(O(n (2^n \log m + n^2))\)。
377. [ABC318Ex] Count Strong Test Cases
首先做一些初步的观察:A 和 B 的解法是对称的,所以 A 对的方案数等于 B 对的方案数。同时若 A 和 B 同时对则每个置换环环长为 \(1\),方案数为 \(n!\)。
所以,若设 A 对的方案数为 \(x\),那么答案为 \(n!^2 - (x - n!) - (x - n!) - n! = n!^2 + n! - x\)。所以转化为算 \(x\)。
A 对当且仅当每个置换环的最大边刚好是编号最小的点的出边。设确定 \(p_i\) 后环长分别为 \(l_1, l_2, \ldots, l_m\),那么安排边权的方案数为 \(n! \prod\limits_{i = 1}^m \frac{1}{l_i}\),其中 \(n!\) 可以放到最后乘。
那么设环的 EGF 为 \(\hat F(x)\),有:
其中 \((i - 1)!\) 为长度为 \(i\) 的圆排列方案数。
设答案的 EGF 为 \(\hat G(x)\),有标号的组合对象拼接,可得:
那么 \(x = n!^2 [x^n] \hat F(x)\)。
时间复杂度 \(O(n \log n)\)。
378. CF1007B Pave the Parallelepiped
容斥太复杂了,考虑不重不漏计数。
把所有数按是否为 \(A\) 的因数、是否为 \(B\) 的因数、是否为 \(C\) 的因数分类,然后再从每个集合中选数即可。
需要乘一个在大小为 \(n\) 的集合中选 \(m\) 个数的方案数 \(\binom{n + m - 1}{m}\)。
379. CF1028E Restore Array
憨憨构造。
首先若所有数都相等就特判,不是全 \(0\) 就不行。
否则设 \(b\) 最大值为 \(x\),那么一定能找到一个位置 \(i\) 使得 \(b_{i - 1} < x \land b_i = x\)。将它旋转到 \(b_{n - 1}\),然后构造 \(a_i\) 就做一个后缀和即可。
380. CF478E Wavy numbers
枚举前 \(7\) 位和后 \(7\) 位,meet-in-the-middle 即可。
381. P4723 【模板】常系数齐次线性递推
考虑构造矩阵 \(M\),其中 \(M_{0, i} = a_{i + 1}\),\(M_{i + 1, i} = 1\),其余位置为 \(0\)。那么:
\(M\) 的特征多项式为 \(\varphi(x) = x^k - a_1 x^{k - 1} - a_2 x^{k - 2} - \cdots - a_k x^0\)。
设 \(x^n = Q(x) \varphi(x) + R(x)\),那么 \(M^n = Q(M) \varphi(M) + R(M)\)。又因为由 Cayley-Hamilton 定理得 \(\varphi(M) = 0\),所以 \(M^n = R(M)\)。
设 \(R(x) = \sum\limits_{i = 0}^{k - 1} r_i x^i\),列向量 \(F = \begin{bmatrix} f_{k - 1} \\ f_{k - 2} \\ \vdots \\ f_0 \end{bmatrix}\)。那么:
于是剩下的问题是求 \(R(x)\),也就是 \(x^n \bmod \varphi(x)\)。直接多项式快速幂即可,每次次数超过 \(k\) 了就对 \(\varphi(x)\) 取模。
时间复杂度 \(O(k \log k \log n)\)。
382. Gym100341C AVL Trees
考虑朴素 dp,设 \(f_{h, i}\) 为高度为 \(h + 1\),结点数为 \(i\) 的树个数,有:
初值有 \(f_{0, 0} = f_{1, 1} = 1\)。
设 \(F_h(x) = \sum\limits_{i \ge 0} f_{h, i} x^i\),那么有:
因为 \(F_h(x)\) 的次数为 \(2^h - 1\),所以可以代入 \(\omega_{2^{h + 1}}\) 求点值,最后再代入求 \(F_h(x)\) 单点的值。
时间复杂度 \(O(h 2^h)\)。
383. HDU7057 Buying Snacks
朴素 dp,设 \(f_{n, m}\) 为考虑了前 \(n\) 种零食,花了 \(m\) 元。转移式为:
设 \(F_n(x) = \sum\limits_{i \ge 0} f_{n, i} x^i\),有:
矩阵快速幂即可,时间复杂度 \(O(m \log m \log n)\)。
384. CF1326F2 Wise Men (Hard Version)
考虑子集反演,钦定 \(01\) 串中一些位置是 \(1\),其余任意。
那么最后做一次类似逆高维前缀和即可。
考虑把一个人的排列分成极长的认识段,那么注意到段长集合相同的 \(01\) 串,方案数也相同。
所以我们先 dp 求出 \(f_{S, i}\) 表示以第 \(i\) 个人结尾,以 \(S\) 中的集合作为点的链的个数,进而求出 \(g_{i, S}\) 表示 \(|S| = i\) 且以 \(S\) 中的集合作为点的链的个数。
然后我们枚举 \(n\) 的划分,边递归下去边做 FWT 点乘,最后因为只用得到 \(2^n - 1\) 处的值所以直接 \(O(2^n)\) 朴素计算即可。
385. CF865G Flowers and Chocolate
设 \(F(x) = (\sum\limits_i x^{p_i})^n\),\(g_i\) 为 \(\sum\limits_{j = 1}^{|b|} c_{b_j} = i\) 的方案数。显然 \(g_i\) 满足线性递推,若往右平移 \(m - 1\) 位(设 \(m = \max\limits_{i = 1}^B c_i\)),就是一个满足前 \(m\) 项只有一项有值的线性递推,设其特征多项式为 \(\varphi(x)\)。
可以写出答案:
多项式快速幂即可。多项式部分可以使用朴素的 \(O(n^2)\) 实现。
386. P4199 万径人踪灭
不连续的限制是好处理的,最后答案减掉不回文的子串个数即可。
考虑若求出沿某条线或某个格子为轴,相等的字符数量 \(c\),那么这个轴的贡献为 \(2^c - 1\)。
直接 FFT 或 NTT 求 \(f_x = \sum\limits_{i = 0}^x (s_i - t_{x - i})^2\) 即可。
387. P3784 [SDOI2017] 遗忘的集合
考虑生成函数,有:
两边取对数,有:
对 \(F(x)\) 求 \(\ln\) 后再从小到大看 \(i\) 在不在 \(S\) 中即可。
388. CF335F Buy One, Get One Free
神仙反悔贪心。
考虑先把相同的物品压成一段。考虑一段物品时,求出可以白嫖的物品个数 \(p\) 和必须买的物品个数 \(q\)。再用一个堆把所有白嫖的物品存下来。
每次把堆顶拿出来,设为 \(t\),设当前物品价格为 \(x\)。
- 若 \(t < x\) 可以买 \(t\) 然后白嫖两个 \(x\);
- 否则买 \(x\),并且加入反悔物品 \(2x - t\)。
389. P5447 [THUPC2018] 赛艇
相当于是做二维差卷积。
但是不会做二维卷积怎么办!发现可以把他压成一维的,然后新坐标变成 \(mx + y\),然后做完了。
390. P6049 燔祭
显然求出 \(m = [1, O(n)]\) 的答案,插值即可。
设 \(F_k(x)\) 为 \(m = k\) 时答案的 EGF,设 \(G_k(x) = \sum\limits_{i = 1}^k F_k(x)\)。
那么 \(m = k\) 时相当于是 \(F_k(x) = x \exp(G_k(x)) = x \exp(G_{k - 1}(x) + F_k(x)) = x \exp(G_{k - 1}(x)) \exp(F_k)\)。
利用 \(\exp F(x)\) 的 \(O(n^2)\) 递推的方法可以 \(O(n^2)\) 计算出 \(F_k(x)\)。总时间复杂度 \(O(n^3)\)。
391. P5850 calc加强版
设 \(F(x) = \prod\limits_{i = 1}^K (ix + 1)\),答案即为 \(n! [x^n] F(x)\)。
看到乘法直接考虑取 \(\ln\),有 \(\ln F(x) = \sum\limits_{i = 1}^k \sum\limits_{j \ge 1} \frac{(-1)^{j + 1} i^j}{j} x^j\)。
若求出 \(\ln F(x)\) 就可以直接 \(\exp\) 回去求出 \(F(x)\)。
我们现在要对于 \(j \in [1, n]\),求出 \(\sum\limits_{i = 1}^k i^j\)。
考虑这玩意的 EGF:
求出分母和分子前 \(n + 1\) 项系数后分子卷上分母的逆即可。
注意到分子和分母可以提出一个 \(x\) 的公因式,然后分母的零次项就不为 \(0\) 了。
时间复杂度 \(O(m \log m)\)。
392. P5162 WD与积木
考虑分别把总层数和总方案数求出来。
一层的 EGF 是 \(F(x) = e^x - 1\)。
总方案数的 EGF 是 \(\sum\limits_{i \ge 1} F(x)^i = \frac{1}{1 - F(x)} = \frac{1}{2 - e^x}\)。
总层数的 EGF 是 \(\sum\limits_{i \ge 1} i F(x)^i = \frac{F(x)}{(1 - F(x))^2} = \frac{e^x - 1}{(2 - e^x)^2}\)。
求逆即可。时间复杂度 \(O(n \log n + T)\)。
393. P10532 [XJTUPC2024] 筛法
不难发现每个数对恰好被统计一次,所以答案就是 \(n^2\)。
394. CF1965F Conference
考虑题目可以看成天和人的匹配,因此判断单个日期区间 \([l, r]\) 可以考虑 Hall 定理,设 \(N(S)\) 为在 \(S\) 这些天有空的人的数量,定义 \(S\) 合法当且仅当 \(|N(S)| \ge |S|\),那么 \([l, r]\) 合法当且仅当 \(\forall S \subseteq [l, r]\),\(S\) 合法。
猜测只用 check 形成一段区间的 \(S\),但是会被下面的数据叉掉:
3
1 3
2 2
2 2
对于 \([1, 3]\),只有 \(\{1, 3\}\) 不合法。
因此考虑对初始的线段进行一些处理。发现对于两条线段 \([a, b]\) 和 \([a, c]\)(其中 \(b \le c\)),把它们换成 \([a, b], [a + 1, c]\) 不影响结果(特别地,若 \(a = b = c\) 则相当于删去 \([a, c]\) 这条线段)。这部分实现可以扫描线,枚举 \(l\),把最小且 \(\ge l\) 的右端点 \(r\) 和 \(l\) 形成的线段 \([l, r]\) 加入。
处理后每个人的线段的左端点互不相同,这时候就只用 check 形成一段区间的 \(S\) 了,因为若 \(|N(S)| < |S|\) 且 \(\exists x, y \in S\) 使得 \([x + 1, y - 1]\) 都不属于 \(S\),那么加入 \([x + 1, y - 1]\) 后 \(|N(S)| < |S|\) 仍然满足,因为每加一个数 \(|N(S)|\) 至多增加 \(1\)。
所以此时不合法区间满足单调性,即若 \([l, r]\) 不合法,那么 \([l - 1, r], [l, r + 1]\) 都不合法。
所以可以双指针求出,对于每个 \(l\) 最大的 \(r\),使得 \([l, r]\) 合法(\([l, r + 1]\) 不合法)。
最后差分统计一下即可。
时间复杂度 \(O((n + V) \log n)\)。

浙公网安备 33010602011771号