2026.8 水母病
P4208 最小生成树计数
考虑 kruskal 的过程,连接了所有 \(\leq x\) 的边后并查集的状态总是固定的,且同边权边不超过 \(10\) 条。于是按边权暴力分层计算,复杂度 \(O(2^{10}m)\)。
upd: 去掉同边权数量限制之后可以 Matrix-Tree 定理完成。
P5406 THUPC2019 找树
这个猎奇权值设计很明显不是让你算,,,用 FWT 拆掉之后用 Matrix-Tree 算出最大存在的权值即可。
P4240 毒瘤之神的考验
神题。
分开计算,\(f(n)=\sum_{d|n}\frac{d\mu(\frac{n}{d})}{\varphi(d)},g(k,n)=\sum_{i=1}^{n}\varphi(ik)\),都可以做到 \(O(n\ln n)\)。
代入:\(\sum_{i=1}^{n} \sum_{j=1}^{m} \varphi(ij)=\sum_{k=1}^n f(k)\times g(k,\left \lfloor \frac{n}{k} \right \rfloor)\times g(k,\left \lfloor \frac{m}{k} \right \rfloor )\)
直接上整除分块算不了,参数化原式观察:
\(S(x,y,n)=\sum_{k=1}^n f(k)\times g(k,x)\times g(k,y),\)
\(S(x,y,n)=S(x,y,n-1)+f(n)\times g(n,x) \times g(n,y)\)
这时候再对原式整除分块,总贡献形如:
\(\sum_{l,r} S(\left \lfloor \frac{n}{r} \right \rfloor,\left \lfloor \frac{m}{r} \right \rfloor,r)-S(\left \lfloor \frac{n}{l} \right \rfloor,\left \lfloor \frac{m}{l} \right \rfloor,l-1)\)
由于 \(g(i,j)\) 总是有 \(i\times j\leq n\),所以 \(S(x,y,z)\) 有 \(\max(x,y)\times z \leq n\) 在 \(x,y\) 较大时 \(z\) 较小,反之 \(z\) 较大时 \(x,y\) 较小。
这引出复杂度平衡的一套理论,设置阈值 \(B\),预处理 \(S(1,1,1) \sim S(B,B,n)\),对于 \(\exists x>B,y>B\) 的 \(S(x,y,z)\),直接 \(O(\frac{n}{B})\) 暴力计算即可。
精细分析一下,总复杂度是 \(O(n\ln n+nB+T(B+\frac{n}{B}))\),理论 \(B\) 取到 \(10\) 左右最优,考虑常数问题,实际测试中 \(B=50\) 表现最好。
P13068 [GCJ 2020 #3] Pen Testing
暴力搜决策树加上优化剪枝,具体见 这里。
upd: 这里好多乱搞调调参过的啊,,,,感觉我完全不理解。
P5296 生成树计数
\((\sum w_i)^k = k![x^k]\prod e^{w_ix}\)。
P7409 SvT
对反串建 SAM,每次查询建虚树。
HDU5909 Tree Cutting
\(dp(i,j)\) 表示以 \(i\) 为最浅端点的子树中异或值为 \(j\) 的 substree 数量,用 FWT 加速转移。
ARC207A Affinity for Artifacts
虽然灯的成本很大,但是我们能减少的成本是依赖于 \(n\) 很少的。这其中不好处理的部分就是一个灯的成本在变为 \(0\) 后不会继续减少,启发我们使用延迟决策处理。
设 \(dp(i,j,k)\) 表示点亮了 \(i\) 个灯,钦定了 \(j\) 个成本 \(\geq i\) 的灯,总成本减少了 \(k\) 的方案数;\(a_i\) 表示有多少个灯成本为 \(i\),\(b\) 为 \(a\) 的前缀和。考虑此时点亮一个灯,确定成本为 \(i\) 的灯的贡献,转移:
在 \(i+1\) 钦定一个成本 \(\geq i+1\) 的灯:
在 \(i+1\) 钦定一个成本 \(\leq i\) 的灯:
转移求和的复杂度均摊 \(O(n)\),所以是 3d-0d 的,总复杂度 \(O(n^4)\)。
P7213 最古の遺跡 3
到底有多强?
先观察地震这个操作,得到一些性质:
- 同一时刻中高度相同的石柱不超过两个,这由归纳易证。
- 最后剩下的石柱高度一定是 \(1\sim n\),这由上一条也易得。
- 从后往前扫,让每个石柱被扫到的时候震 \(N\) 次,最终得到的序列相同。考虑一个石柱高度减少的过程,只和其后面石柱高度集合有关。而当后面存在一个高度相同的石柱时此石柱高度才会减少,那么这个高度一定在其震完的后缀中得到保留,这就证明了交换时间空间维度并不影响结论。
于是一个初始高度为 \(h\) 的石柱最终震到 \(0\) 的条件就是从后往前扫时其后面的震后高度集合包含了 \(1\sim h\),以此为分类标准,考虑延迟决策。设 \(f(i,j)\) 表示考虑 \(i\sim 2n\),震后的集合包含了 \(1\sim j\) 的所有高度总方案数。再记 \(a_i\) 为 \(i\sim 2n\) 有几个塌了(不会被钦定)。而接下来设计转移中会碰到两个相同高度取一个的问题,为了方便计数,我们乘一个 \(\frac{1}{2^n}\) 的系数,把相同的两个高度变成不同的。考虑转移:
\(i-1\) 塌了,此时需要填写一个 \(\leq j\) 的数,共 \(2j-j-a_i=j-a_i\) 个填法:
\(i-1\) 没塌。考虑钦定 \(i-1\) 最终高度 \(>j+1\),此时这个位置填的高度也一定大于 \(j+1\):
若 \(i-1\) 最终高度为 \(j+1\),则我们枚举新的一个震后高度前缀 \(1\sim k\)。\(i \sim 2n\) 目前共钦定了 \((2n-i+1)-j-a_i\) 个 \(\geq j+1\) 的位置,系数为 \(\binom{(2n-i+1)-j-a_i}{k-(j+1)}\);而接下来考虑这 \(k-(j+1)\) 个数的所有合法顺序,可以转化为这样一个问题:有 \(1\sim n\) 每个数个两个,选出 \(n\) 个数组成一个数组,地震 \(n\) 次后高度恰好为 \(1\sim n\) 的一个排列。不妨设这个数量为 \(g_n\),考虑第一个元素的最终高度 \(x\),这样就根据最终的高度集合把序列划分成了不相交的两部分,有转移:
最后 \(i-1\) 位置可以填写的数量为 \(k-j+1\),转移:
2d-1d,总复杂度 \(O(n^3)\),很变态。
P1446 [HNOI2008] Cards
题意相当于给定的置换任意组合属于给定的置换集合,且存在逆元,即为一个置换群。所以直接套用 Burnside 引理就是对的。注意不一定给定了单位置换,记得加。
P4128 [SHOI2006] 有色图
色图在哪里?
由 Burnside 引理,答案为 \(\frac{1}{G}\sum_{g\in G} f(g)\),\(G\) 为所有对点置换操作的集合,\(f(g)\) 为在置换 \(g\) 下不变的图个数。显然 \(|G|=n!\),问题在于求解 \(f(g)\)。
把 \(g\) 分解为 \(k\) 个大小为 \(a_1,\cdots,a_k\) 的循环置换。考虑循环置换内部,把 \(a_i\) 个点排在圆周上,端点在圆周上距离相同的边构成一个等价类,所以贡献 \(m^{\left \lfloor \frac{a_i}{2}\right \rfloor}\)。考虑循环置换之间,把每次点的置换操作对应到边上去。对于循环置换 \(a_i,a_j\) 中连接 \(a_i\) 的第 \(p\) 个点的边和 \(a_j\) 的第 \(q\) 个点的边,操作 \([a_i,a_j]\) 次后第一次回到自己,故所有边在这一置换下形成了 \(\frac{a_ia_j}{[a_i,a_j]}=(a_i,a_j)\) 个环,贡献 \(m^{(a_i,a_j)}\)。
方案数其实也只和其循环置换的分解有关,\(n\) 很小,考虑枚举 \(a\) 数组。此时相同长度的循环置换之间可以任意交换顺序,循环置换内是圆排列,所以记 \(c_i=\sum_j [a_j=i]\),一种 \(a\) 的贡献是 \(\frac{n!}{\prod a_i\prod c_i!}\), OEIS 一下可得复杂度 \(O(能过)\)。
指数计算时应对 p-1 取模。
CF1327F AND Segments
拆位后就是序列版的命运。类似手段维护一下就可以。
[ABC277G] Random Walk to Millionaire
一般的做法是把高次方拆下来做期望 dp。
但是接下来,我们从组合意义的视角看这个题目:
考虑任意一条从 \(1\) 开始的路径,设当前已经发生了 \(X\) 次等级增加的事件(即经过了 \(X\) 个 \(C\) 为 \(0\) 的点),令这些事件的集合为 \(|S|=X\),则 \(X^2\) 的组合意义可以表示为:从这 \(X\) 个升级事件中挑选出两个可重的升级事件组成有序二元组 \((A,B)\) 的总方案数,即 \(S\) 和自己的笛卡尔积 \(|S\times S|=X^2\)。
接下来我们应该能预见到(或者设计转移的时候发现)每种方案的概率是不一样的,对这个结构计数没法统计答案。于是我们求出 \(D=\operatorname{lcm}(d_1,d_2,\cdots,d_n)\),其中 \(d_u\) 为点 \(u\) 的度数。然后再令 \(u\) 的每条边重复 \(\frac{D}{d_u}\) 次,这样所有点的度数就相等了,于是任何一个走了 \(k\) 步的方案概率都为 \((D^{-1})^k\)。
对这个结构计数,设 \(dp(u,j,0/1/2)\) 表示当前走了 \(j\) 步到达点 \(u\),填写了二元组的 \(0/1/2\) 个位置的方案数,枚举 \(u\) 的邻居 \(v\),有转移:
\(C_v=0\) 时:
\(C_v=1\) 时:
其中 \(w=\frac{D}{d_u}\),统计答案即为 \(\sum_{t=1}^k(D^{-1})^t\sum_{u=1}^ndp(u,t,2)\)。
但是 \(D\) 可能会特别大,注意到我们的运算是在模 \(998244353\) 意义下进行,所以由裴蜀定理,\(aD+b \times 998244353=1\) 一定存在整数解 \((a,b)\),亦即 \(\exists a \in \mathbb{Z} \ \text{s.t.} \ aD \equiv 1 \pmod{998244353}\),于是直接令模意义下 \(D=1\) 即可。
P6189 跑步
直接做背包写经典的整数拆分时间复杂度爆了,回忆 P4104,对于数目少和总和小各有做法,于是根号分治再合并即可做到 \(O(n\sqrt n)\)。
P14599 CF1093F 加强版
注意到不同的 dp 值最多只有两种。
CF1043F Make It One
神题。
首先注意到答案不会超过 \(7\)。于是我们枚举最后选了多少个数,把判定改为计数,设 \(f(i),g(i)\) 表示选了 \(k\) 个数的情况下,\(i=\gcd,i|\gcd\) 的方案数。
即 \(g(i)=\sum_{i|j}f(j)\),\(f(i)=g(i)-\sum_{i|j,i\neq j} f(j)\)。
令 \(cnt(i)\) 表示有多少个数 \(i\) 的倍数,初始 \(g(i)=\binom{cnt(i)}{k}\)。
从小到大枚举 \(k\),第一次 \(f(1)\geq 1\) 即合法。

浙公网安备 33010602011771号