2025.2 暑假专题记录

2025.2 暑假专题记录

主要记录下暑假专题的作业题做法

树型 DP

P.S. 以下常用 \(u\) 表示当前节点,\(v\) 表示 \(u\) 的儿子

P3047

朴素思路是以每个点为根分别统计其答案,时间复杂度 \(O(n^2)\),无法接受;这启示我们利用其他点的信息,即换根

\(g_{i, j}\) 表示 \(i\) 子树内与其距离为 \(j\) 的点的权值和,显然有转移 \(g_{u, j} = \sum g_{v, j-1}\),我们可以通过一次 dfs 求出 \(g\) 数组

\(f_{i, j}\) 为与点 \(i\) 距离为 \(j\) 的点的权值和,与点 \(v\) 距离为 \(j\) 的点包含两部分:

  • \(v\) 子树内与其距离为 \(j\) 的点,即 \(g_{v, j}\)
  • \(v\) 子树外与其距离为 \(j\) 的点,换句话说是点 \(u\) 子树外与其距离为 \(j-1\) 的点;"子树外"的限制不好处理,可以将其变为 \(f_{u, j-1}\) 挖去 \(v\) 子树对其造成的贡献,即 \(f_{u, j-1}-g_{v, j-2}\)

综上,转移为 \(f_{v, j} \leftarrow g_{v, j}+f_{u, j-1}-g_{v, j-2}\)

初始值为 \(f_{i, 0} = g_{i, 0} = w_i\),点 \(i\) 的答案为 \(\sum_{j=0}^{k} f_{i, j}\)

考虑类似扫描线的思想,当 \(i\) 逐渐增大,村庄 \(j(j \le i)\) 会在某一时刻需要赔偿,影响范围是一段区间

因此考虑线段树优化 dp;预处理出 \(st_i, ed_i\) 表示 \(i\) 左边 / 右边最近不能覆盖到村庄 \(i\) 的位置,当 \(i \ge ed_j\) 时,若从 \([1, st_j]\) 转移则需要对 \(j\) 进行赔偿,此时对 \([1, st_j]\) 进行一次区间加即可;求 \(f_i\) 即为对 \([1-i-1]\) 做一次区间查询

P2279

以下为方便表述,设 \(u\) 为当前节点,\(u_1\)\(u\) 的父亲,\(u_2\)\(u\) 的父亲的父亲,\(v_1\)\(u\) 的儿子,\(v_2\)\(u\) 的儿子的儿子

\(f_{i, j}\) 表示使用 \(i\) 子树中的点,至少覆盖点 \(i\) 子树内以及 \(i\) 祖先节点到第 \(j\) 层所需的最少代价

由于消防局最大覆盖距离为 \(2\),因次 \(|j|\) 最大为 \(2\);为了不漏掉用一个点的祖先覆盖该点的情况,\(j\) 应可以为负;具体的:

  • \(f_{u, 2}\) 表示至少覆盖到 \(u_2\) 这层
  • \(f_{u, 1}\) 表示至少覆盖到 \(u_1\) 这层
  • \(f_{u, 0}\) 表示至少覆盖到 \(u\) 这层
  • \(f_{u, -1}\) 表示至少覆盖到 \(v_1\) 这层
  • \(f_{u, -2}\) 表示至少覆盖到 \(v_2\) 这层

注意状态定义有包含关系,有 \(f_{i, -2} \le f_{i, -1} \le f_{i, 0} \le f_{i, 1} \le f_{i, 2}\)

对于 \(f_{u, 2}\),我们必然要在点 \(u\) 设立消防局,已经能覆盖到 \(v_2\) 这层;因此对于 \(v_1\),至少覆盖到 \(v_1\) 儿子的儿子这层即可,转移为 \(f_{u, 2} \leftarrow \sum f_{v_1, -2}\)

对于 \(f_{u, 1}\),在 \(u\) 设立消防局的情况我们在 \(f_{u, 2}\) 已经考虑过,因此先令 \(f_{u, 1} \leftarrow \min(f_{u, 1}, f_{u, 0})\);现在只考虑在 \(v_1\) 设立消防局,我们钦定在 \(v_{1, x}\) 放,则对于其他 \(v_1\) 只需至少覆盖到 \(v_1\) 儿子这层,转移为 \(f_{u, 1} \leftarrow \min(f_{v_{1, x}, 2} + \sum_{v_1 \ne v_{1, x}} f_{v_1, -1})\)

对于 \(f_{u, 0}\),同理先令 \(f_{u, 0} \leftarrow \min(f_{u, 0}, f_{u, 1}, f_{u, 2})\);与 \(f_{u, 1}\) 类似,我们钦定在 \(v_{1, x}\) 的子树中放消防局往上覆盖到 \(u\) 这层,代价即为 \(f_{v_{1, x}, 1}\),其他 \(v_1\) 只需至少覆盖到它自己这层,转移为 \(f_{u, 0} \leftarrow \min(f_{v_{1, x}, 1} + \sum_{v_1 \ne v_{1, x}} f_{v_1, 0})\)

对于 \(f_{u, -1}\),先令 \(f_{u, -1} \leftarrow \min(f_{u, -1}, f_{u, 0}, f_{u, 1}, f_{u, 2})\);此时 \(v_{1, x}\) 子树中的消防局对其他 \(v_1\) 没有影响,所有儿子没有区别,只需覆盖到自己这层,转移为 \(f_{u, -1} \leftarrow \sum f_{v_1, 0}\)

对于 \(f_{u, -2}\),先令 \(f_{u, -2} \leftarrow \min(f_{u, -2}, f_{u, -1}, f_{u, 0}, f_{u, 1}, f_{u, 2})\);与 \(f_{u, -1}\) 类似,\(v_1\) 只需覆盖到它的儿子这层,转移为 \(f_{u, -2} \leftarrow \sum f_{v_1, -1}\)

对于叶子,初始值为 \(f_{u, 4} = f_{u, 3} = f_{u, 2} = 1\),非叶子则为 \(f_{u, 4} = 1\);答案为 \(f_{root, 0}\)

ABC160F

本质上这个问题是树上拓扑序计数

注意到只要对于点 \(i\) 子树内任一点 \(j\),都有 \(j\) 子树内 \(j\) 最先填 (递归满足即可),这样的填数方案就是合法的

记点 \(i\) 的子树大小为 \(siz_i\),则对于点 \(i\) 子树内的所有填数方案,只有 \(\frac{1}{siz_i}\) 是合法的,因为我们需要保证 \(i\) 最先填;那么总合法方案数为 \(\frac{n!}{\prod siz_i}\)

那么问题转化为需要快速求出以每个点为根时的 \(\prod siz_i\),考虑换根

\(f_i\) 为以 \(i\) 为根时 \(\prod siz_i\) 的值;从以 \(u\) 为根变为以 \(v\) 为根时,\(siz'_u \leftarrow n-siz_v\)\(siz'_v \leftarrow n\),因此有转移 \(f_v \leftarrow f_u \times \frac{n-siz_v}{n} \times \frac{n}{siz_v} = f_u \times \frac{n-siz_v}{siz_v}\)

P4516

考虑如何设计 dp 状态;显然需要一维 \(i\) 表示点编号,背包维 \(j\) 表示用了多少监听设备;直接做没法转移,考虑增加两维 \(0/1\), \(0/1\) 表示是否在点 \(i\) 上放监听设备、点 \(i\) 是否被监听

综上,考虑设 \(f_{i, j, 0/1, 0/1}\) 表示以 \(i\) 为根的子树中放了 \(j\) 个监听设备,点 \(i\) 上是否放了监听设备,点 \(i\) 是否被监听的方法数

这是一个树上背包,我们按照 \(f_{u, i+j, \cdots} \leftarrow f_{u, i, \cdots}, f_{v, j, \cdots}\) 的方式转移

考虑分类讨论转移策略:

  • 对于 \(f_{u, i+j, 0, 0}\)\(u\) 自己没放也没被监听,儿子上不能放,且必须已经被监听 (因为从 \(u\) 监听的路已经断了);因此转移为 \(f_{u, i+j, 0, 0} \leftarrow \sum (f_{u, i, 0, 0} \times f_{v, j, 0, 1})\)
  • 对于 \(f_{u, i+j, 1, 0}\)\(u\) 自己放但没被监听,儿子上不能放,且是否已被监听都行;转移为 \(f_{u, i+j, 1, 0} \leftarrow \sum (f_{u, i, 1, 0} \times f_{v, j, 0, 0/1})\)
  • 对于 \(f_{u, i+j, 0, 1}\), \(u\) 自己没放但被监听,对之前 \(u\) 是否已被监听分类讨论:
    • 若之前未被监听且 \(v\) 处放完后被监听,则 \(v\) 处必然又放又被监听 (因为无法从 \(u\) 监听),转移为 \(f_{u, i+j, 0, 1} \leftarrow \sum (f_{u, i, 0, 0} \times f_{v, j, 1, 1})\)
    • 若之前已被监听,则 \(v\) 处必然被监听,放不放无所谓,转移为 \(f_{u, i+j, 0, 1} \leftarrow \sum (f_{u, i, 0, 1} \times f_{v, j, 0/1, 1})\)
  • 对于 \(f_{u, i+j, 1, 1}\)\(u\) 自己放也被监听,同样分类讨论:
    • 若之前未被监听且 \(v\) 处放完后被监听,则 \(v\) 处必然放,是否已经被监听无所谓,转移为 \(f_{u, i+j, 1, 1} \leftarrow \sum (f_{u, i, 1, 0} \times f_{v, j, 1, 0/1})\)
    • 若之前已被监听,则 \(v\) 处状态随意,转移为 \(f_{u, i+j, 1, 1} \leftarrow \sum (f_{u, i, 1, 1} \times f_{v, j, 0/1, 0/1})\)

初始值为点 \(u\) 自己放或不放,即 \(f_{u, 0, 0, 0} = f_{u, 1, 1, 0} = 1\);最终只需要 \(root\) 被监听,答案为 \(f_{root, k, 0, 1} \times f_{root, k, 1, 1}\)

实现时注意对每个 \(v\),在转移到 \(u\) 前先缓存一份 \(u\) 的当前答案防止转移混乱;加上 \(siz\) 的优化后时间复杂度是 \(O(nk)\)

P4284

由于每个点贡献都是 \(1\),期望和实际上就是概率和

与第一道题有点像,考虑换根,第一次处理子树内贡献,第二次处理子树外贡献

不妨直接根据题意设 \(f_i\) 表示点 \(i\) 通电的概率

先考虑子树内;那么点 \(u\) 通电有两种可能:

  • \(u\) 自己开始就通电
  • \(u\) 的某个儿子 \(v\) 通电,顺着 \((u, v)\) 转移过来

注意若事件 A 发生的概率为 \(P(A)\),事件 B 发生的概率为 \(P(B)\),则两者至少发生一个的概率为 \(P(A) \times (1-P(B))+P(B) \times (1-P(A))+P(A) \times P(B) = P(A)+P(B)-P(A) \times P(B)\)

因此不妨初始设 \(f_u \leftarrow q_u\);则转移为 \(f_u \leftarrow f_u+f_v \times p(u, v)-f_u \times f_v \times p(u, v)\)

再考虑子树外;一种显然的想法是直接用第一次求出的 \(f_u\) 反回来更新 \(f_v\),但这是不正确的,因为这里的 \(f_u\) 包含 \(f_v\) 对其的贡献,相当于 \(f_v\) 自己转移到自己,显然是错的;因此我们考虑挖掉 \(f_v\)\(f_u\) 造成的贡献,再转移回 \(f_v\)

不妨认为第一次求出的 \(f_u\) 最后一个从 \(f_v\) 转移 (换句话说,\(v\)\(u\) 的最后一个儿子),记转移前 \(f_u = f_{u_{pre}}\),转移后 \(f_u = f_{u_{last}}\),易知 \(f_{u_{last}} = f_{u_{pre}}+f_v \times p(u, v)-f_{u_{pre}} \times f_v \times p(u, v)\),可以反解出 \(f_{u_{pre}} = \frac{f_{u_{last}}-f_v \times p(u, v)}{1-f_v \times p(u, v)}\) (P.S. 注意特判 \(f_v \times p(u, v) = 1\));我们用 \(f_{u_{pre}}\) 按照第一次的方式更新 \(f_v\) 即可

答案为 \(\sum f_i\)

P9745

对于与异或有关的题,常见的想法是拆位;本题涉及断边操作,考虑将与当前点直接相连 / 非直接相连的连通块价值刻画进状态内

\(f_i\) 为点 \(i\) 子树内的答案,\(g_{i, j, k}\) 为以 \(i\) 为根的子树内断掉若干边,与 \(i\) 相连的连通块价值在二进制下第 \(j\)\(k\) 时,不与 \(i\) 相连的所有连通块的价值乘积和

我们有 \(f_u = \sum_{i=0}^{63} (2^i \times g_{u, i, 1})\) (对于 \(g_{u, i, 0}\),其已经在 \(u\) 子树内某点为根时统计过)

考虑如何转移;对于 \(u\) 与儿子 \(v\),分类讨论 \(g_{u, i, 0/1}\) 的来源:

  • 对于 \(g_{u, i, 0}\)

    • 不断 \((u, v)\),可以由自己的 \(0\) 异或上儿子的 \(0\),或由自己的 \(1\) 异或上儿子的 \(1\) 得来
    • \((u, v)\),只能由自己的 \(0\) 得来

    综上,\(g_{u, i, 0} \leftarrow g_{u, i, 0} \times (g_{v, i, 0} + f_v) + g_{u, i, 1} \times g_{v, i, 1}\)

  • 对于 \(g_{u, i, 1}\)

    • 不断 \((u, v)\),可以由自己的 \(0\) 异或上儿子的 \(1\),或由自己的 \(1\) 异或上儿子的 \(0\) 得来
    • \((u, v)\),只能由自己的 \(1\) 得来

    综上,\(g_{u, i, 1} \leftarrow g_{u, i, 0} \times g_{v, i, 1} + g_{u, i, 1} \times (g_{v, i, 0} + f_v)\)

初始值为若 \(a_u\)\(i\) 位为 \(1\)\(g_{u, i, 1} = 1\),反之 \(g_{u, i, 0} = 1\);答案为 \(f_{root}\)

P3523

咕咕咕。感觉没太理解。

CF1394D

首先,对于边 \((u, v)\),若 \(b_u \ne b_v\) 则这条边的方向确定

题目转化为给未定向的边定向,使得总权值和最小

从整体上不太好刻画,我们考虑拆贡献;对于点 \(u\),记其入度为 \(in_u\),出度为 \(out_u\),一条经过它的链要么对 \(in_u\) 贡献 \(1\),要么对 \(out_u\) 贡献 \(1\) (因为 \(u\) 可能是链头或链尾);因此点 \(u\) 的贡献为 \(\max(in_u, out_u) \times a_u\)

考虑调整法;我们在一开始先强行令未定向边都从儿子指向父亲,再逐个调整

\(f_{u, 0/1}\) 表示强制 \(u \rightarrow fa_u\) / 强制 \(u \leftarrow fa_u\)\(u\) 子树内的答案

注意到对于 \(v\),我们必然贪心地选 \(f_{v, 1}-f_{v, 0}\) 最小的进行更改,直接模拟,边改边更新即可

P8867

显然对于一个边双,爱咋建咋建,肯定合法;这启示我们先缩边双,将原图转化为一棵树

\(f_{i, 0/1}\) 表示点 \(i\) 子树内放不放军营的方案数;不过对于点 \(u\),点 \(v\) 的军营是否已经合法,是否需要连到 \(u\),好像都不太清楚,没法转移

因此我们更新状态,设 \(f_{i, 0/1}\) 表示点 \(i\) 子树内放不放军营,且若放则必须连到 \(i\) 的方案数

对于点 \(u\),记 \(u\) 代表的边双点数为 \(V_u\),边数为 \(E_u\),依次对每个儿子考虑转移:

  • 对于 \(f_{u, 0}\),显然有 \(f_{u, 0} \leftarrow f_{u, 0} \times f_{v, 0}\)
  • 对于 \(f_{u, 1}\),分类讨论 \(u\) 之前放没放军营:
    • \(u\) 之前没放,则 \(v\) 放,\((u, v)\) 边必须看守,\(f_{u, 1} \leftarrow f_{u, 0} \times f_{v, 1}\)
    • \(u\) 之前放,则 \(v\) 可放可不放,不放则 \((u, v)\) 边可看可不看,\(f_{u, 1} \leftarrow f_{u, 1} \times (f_{v, 0} \times 2+f_{v, 1})\)

初始值为 \(f_{u, 0} = 2^{E_u}\)\(f_{u, 1} = 2^{E_u+V_u}-2^{E_u}\)

此时答案就是 \(f_{root, 0/1}\) 么?如果直接算,相当于强制 \(root\) 子树内的每个军营都连到 \(root\),无论 \(root\) 是否有军营;这显然是不对的

因此我们对每个点 \(u\) 都统计一遍,每次强制 \(u\) 建军营,\(u\) 子树外的点全部不建军营;先处理出点 \(u\) 子树内的边数 \(Esiz_u\),则答案为 \(\sum (f_{u, 1} \times 2^{Esiz_{root}-Esiz_u-1})\)

ARC098D

咕咕咕。放到以后刷 Kruskal 重构树的 blog 里面吧。

DP 优化

P2605

首先考虑朴素 dp

\(f_{i, j}\) 表示前 \(i\) 个村庄建立 \(j\) 个基站的最小代价

显然有转移 \(f_{i, j} = c_i + \min(f_{k, j-1} + cost(k, i))\),其中 \(cost(k, i)\) 表示村庄 \(i \sim k\) 中需要的赔偿费用,时间复杂度 \(O(n^2k)\),无法接受

注意到第二维的 \(j\) 可以去掉,提到最外面枚举即可

考虑类似扫描线的思想;预处理出 \(st_i, ed_i\) 表示点 \(i\) 左侧 / 右侧最近的覆盖不到 \(i\) 的位置,当 \(i \ge ed_j\) 时将村庄 \(j\) 的赔偿费用加进去,形如对 \([1, st_j]\) 的区间加

\(f_i\) 即为对 \([1, i-1]\) 的区间询问;线段树维护即可

P3628

\(f_i\) 表示前 \(i\) 个点的答案

容易得到转移 \(f_i = f_j+F(s_i-s_j)\)\(s_i\) 为前 \(i\) 个点的前缀和,\(F(x)\) 为题目中定义的二次函数

不妨设 \(j>k\)\(j\) 的转移优于 \(k\),则有:

\(f_j+a(s_i-s_j)^2+b(s_i-s_j)+c > f_k+a(s_i-s_k)^2+b(s_i-s_k)+c\)

\(f_j-2as_is_j+as_{j}^{2}-bs_j > f_k-2as_is_k+as_{k}^{2}-bs_k\)

\((f_j+as_{j}^{2}-bs_j)-(f_k+as_{k}^{2}-bs_k) > 2as_i(s_j-s_k)\)

\(g(x) = f_x+as_{x}^{2}-bs_x\),则有

\(\frac{g(j)-g(k)}{2a(s_j-s_k)} > s_i\)

我们将 \(s_i\) 看做横坐标,\(g(i)\) 看做纵坐标,则每个 \(i\) 在坐标系中对应一个点,原式可看做斜率;

对于坐标系中三点 \(P_1, P_2, P_3\),若 \(P_2\) 可能最优,则有 \(k(P_1, P_2) \ge s_i \ge k(P_2, P_3)\);因此我们要维护一个斜率递降的点集,可以直接单调队列,队首就是最优转移点

P4360

\(sd_i\) 为距离的后缀和,\(sw_i\) 为重量的前缀和,\(s = \sum (w_i \times sd_i)\) 表示总费用

\(f_i\) 为在点 \(i\) 放第二个锯木厂的最小代价,容易得到 \(f_i = \min_{j=1}^{i-1} (s-sw_j \times sd_j-(sw_i-sw_j) \times sd_i)\),即先将 \(1 \sim j\) 的木材运到 \(j\),再将 \(j+1 \sim i\) 的木材运到 \(i\)

不妨设 \(j>k\)\(j\) 的转移优于 \(k\),则有:

\(s-sw_j \times sd_j-(sw_i-sw_j) \times sd_i < s-sw_k \times sd_k-(sw_i-sw_k) \times sd_i\)

\(sd_i \times (sw_j-sw_k) < sw_j \times sd_j - sw_k \times sd_k\)

\(g(x) = sw_x \times sd_x\),则有

\(\frac{g(j)-g(k)}{sw_j-sw_k} > sd_i\)

同理对于坐标系中三点 \(P_1, P_2, P_3\),若 \(P_2\) 可能最优,则有 \(k(P_1, P_2) \ge sd_i \ge k(P_2, P_3)\);因此我们维护一个斜率递降的点集,单调队列即可,队首就是最优转移点

P3349

暴力状压做法即设 \(f_{i, j, S}\) 表示点 \(i\)\(j\),子树内使用的编号集合,时间复杂度 \(O(3^nn^3)\)

瓶颈在于枚举子集,考虑优化这一过程;注意到记录 \(S\) 的原因是需要保证 \(1 \sim n\) 刚好出现一次,尝试扔掉这个性质

这启示我们容斥;枚举 \(S\),先钦定填的编号是 \(S\) 的子集,再减去重复的情况

\(f_{i, j}\) 表示点 \(i\)\(j\),子树内的方案数,转移为 \(f_{u, j} \leftarrow \prod f_{v, k}\),其中 \(j \in S, k \in S, (j, k) \in E\),时间复杂度 \(O(3^n2^n)\)

CF383E

注意到题目很像 SOS dp,尝试往相关方向转化

设当前元音字母集合为 \(S\),考虑转化为求补集,即求所有字母为 \(\overline S\) 的子集的单词数量

\(f(S)\) 为字母集合为 \(S\) 的单词数量,即求 \(g(S) = \sum_{T \in S} f(T)\),这是 SOS dp 的经典形式

\(S\) 的每位看作数组的一维,则 \(T \subseteq S \iff \forall i(T_i \le S_i)\),因此子集求和等价于对数组做高维前缀和

实现上,我们先枚举每位 \(i\),再枚举集合 \(S\)

  • \(S_i = 1\),令 \(f_S \leftarrow f_S+f_{S \oplus 2^i}\) (即将该位的 \(0\) 累加到 \(1\) 上)
  • \(S_i = 0\),无需另外做前缀和,无事发生

记第 \(i\) 个字符串形成的集合为 \(S_{s_i}\),初始值为 \(f_{S_{s_i}} = 1\),答案为 \(\bigoplus (n-f_S)^2\)

数学

P2568

即求

\(\displaystyle \sum_{p \in prime} \sum_{i=1}^{n} \sum_{j=1}^{n} [gcd(i, j) = p]\)

\(= \displaystyle \sum_{p \in prime} \sum_{i=1}^{\lfloor \frac{n}{p} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{p} \rfloor} [gcd(i, j)=1]\)

\(= \displaystyle \sum_{p \in prime} (-1+\sum_{i=1}^{\lfloor \frac{n}{p} \rfloor} (2\sum_{j=1}^{i} [gcd(i, j)=1]))\)

这里 \(-1\) 是因为 \(i = 1, j = 1\) 会被算两次

\(= \displaystyle \sum_{p \in prime} (-1+2\sum_{i=1}^{\lfloor \frac{n}{p} \rfloor} \varphi(i))\)

筛出 \(\varphi(i)\) 做前缀和即可

P2257

不妨设 \(n \le m\),即求

\(\displaystyle \sum_{p \in prime} \sum_{i=1}^{n} \sum_{j=1}^{m} [gcd(i, j) = p]\)

\(= \displaystyle \sum_{p \in prime} \sum_{i=1}^{\lfloor \frac{n}{p} \rfloor} \sum_{j=1}^{\lfloor \frac{m}{p} \rfloor} [gcd(i, j)=1]\)

此时由于 \(n, m\) 不同,无法直接化为 \(\varphi(i)\) 的形式

对于 \([gcd(i, j) = 1]\),还有一个常见变形是利用莫比乌斯反演化为 \(\sum_{d|gcd(i, j)} \mu(d)\)

\(= \displaystyle \sum_{p \in prime} \sum_{i=1}^{\lfloor \frac{n}{p} \rfloor} \sum_{j=1}^{\lfloor \frac{m}{p} \rfloor} \sum_{d|gcd(i, j)} \mu(d)\)

交换下求和顺序

\(= \displaystyle \sum_{p \in prime} \sum_{d=1}^{\lfloor \frac{n}{p} \rfloor} \mu(d) \sum_{i=1}^{\lfloor \frac{n}{pd} \rfloor} \sum_{j=1}^{\lfloor \frac{m}{pd} \rfloor} 1\)

\(= \displaystyle \sum_{p \in prime} \sum_{d=1}^{\lfloor \frac{n}{p} \rfloor} \mu(d) \lfloor \frac{n}{pd} \rfloor \lfloor \frac{m}{pd} \rfloor\)

发现后面挂着的 \(\lfloor \frac{n}{pd} \rfloor \lfloor \frac{m}{pd} \rfloor\) 影响我们预处理,不妨设 \(k=pd\),考虑将 \(k\) 提到前面去

\(= \displaystyle \sum_{k=1}^{n} \lfloor \frac{n}{k} \rfloor \lfloor \frac{m}{k} \rfloor (\sum_{p|k, p \in prime} \mu(\frac{k}{p}))\)

此时后面就可以预处理了,筛出 \(\mu(i)\) 后枚举质数 \(p\),累加到其所有倍数上即可

P4588

直接模拟的问题在于 \(M\) 可能非质数,有可能不存在逆元

考虑单独将 \(x\)\(M\) 不互质的部分 (相同的质因子) 拉出来,维护其幂次,其余部分正常做即可

P3911

\(A_i, A_j\) 不好维护,考虑将"在下标上统计"转化为"在值域上统计"

\(c_i\)\(i\) 这一值的出现次数,\(n\)\(\max A_i\),即求

\(\displaystyle \sum_{i=1}^{n} \sum_{j=1}^{n} (c_i \times c_j \times lcm(i, j))\)

考虑将 \(lcm\) 变为我们较为熟悉的 \(gcd\)

\(= \displaystyle \sum_{i=1}^{n} \sum_{j=1}^{n} (c_i \times c_j \times \frac{ij}{gcd(i, j)})\)

\(= \displaystyle \sum_{k=1}^{n} \sum_{i=1}^{n} \sum_{j=1}^{n} ([gcd(i, j)=k] \times c_i \times c_j \times \frac{ij}{k})\)

\(= \displaystyle \sum_{k=1}^{n} \sum_{i=1}^{\lfloor \frac{n}{k} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{k} \rfloor} ([gcd(i, j)=1] \times c_{i \times k} \times c_{j \times k} \times \frac{i \times k \times j \times k}{k})\)

\(= \displaystyle \sum_{k=1}^{n} \sum_{i=1}^{\lfloor \frac{n}{k} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{k} \rfloor} ([gcd(i, j)=1] \times c_{i \times k} \times c_{j \times k} \times i \times j \times k)\)

变成莫比乌斯反演的形式

\(= \displaystyle \sum_{k=1}^{n} \sum_{i=1}^{\lfloor \frac{n}{k} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{k} \rfloor} \sum_{d|gcd(i, j)} \mu(d) \times (c_{i \times k} \times c_{j \times k} \times i \times j \times k)\)

交换求和顺序

\(= \displaystyle \sum_{k=1}^{n} \sum_{d=1}^{\lfloor \frac{n}{k} \rfloor} \mu(d) \sum_{i=1}^{\lfloor \frac{n}{kd} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{kd} \rfloor} (c_{i \times k \times d} \times c_{j \times k \times d} \times i \times d \times j \times d \times k)\)

\(= \displaystyle \sum_{k=1}^{n} \sum_{d=1}^{\lfloor \frac{n}{k} \rfloor} \mu(d) \times (d^2 \sum_{i=1}^{\lfloor \frac{n}{kd} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{kd} \rfloor} (c_{i \times k \times d} \times c_{j \times k \times d} \times i \times j \times k))\)

\(kd = T\) 以简化式子

\(= \displaystyle \sum_{k=1}^{n} \sum_{d=1}^{\lfloor \frac{n}{k} \rfloor} \mu(d) \times d \sum_{i=1}^{\lfloor \frac{n}{T} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{T} \rfloor} (c_{i \times T} \times c_{j \times T} \times i \times j \times T)\)

\(= \displaystyle \sum_{k=1}^{n} \sum_{d=1}^{\lfloor \frac{n}{k} \rfloor} \mu(d) \times d \sum_{i=1}^{\lfloor \frac{n}{T} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{T} \rfloor} (c_{i \times T} \times c_{j \times T} \times i \times j \times T)\)

把后面的 \(T\) 提到最前面

\(= \displaystyle \sum_{T=1}^{n} T (\sum_{d|T} \mu(d) \times d) \sum_{i=1}^{\lfloor \frac{n}{T} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{T} \rfloor} (c_{i \times T} \times c_{j \times T} \times i \times j)\)

\(= \displaystyle \sum_{T=1}^{n} T (\sum_{d|T} \mu(d) \times d) (\sum_{i=1}^{\lfloor \frac{n}{T} \rfloor} c_{i \times T} \times i)^2\)

筛出 \(\mu(i)\),可以预处理出 \(\sum_{d|T} \mu(d) \times d\),时间复杂度 \(O(n \ln n)\)

枚举 \(T\),后面暴力算,时间复杂度也是 \(O(n \ln n)\),于是总复杂度 \(O(n \ln n)\)

AGC003D

这是一个抽象做法

对于本身就是完全立方数的数,最多选 \(1\) 个,剩下的扔掉不管

考虑对于每个 \(s_i\) 求出其"共轭数" (相乘为完全立方数的数),对于每对共轭数,贪心地选出现次数多的

数据范围不支持我们直接分解质因数……么?注意到 \(\frac{\sqrt{n}}{\ln \sqrt{n}} \approx 10000\),平均分解次数不会很大,筛出 \(\sqrt{n}\) 以内质数后大力分解质因数,拿掉立方因子,顺便算一下共轭数即可

字符串

P4555

\(l_i\) 表示以 \(i\) 为结尾的最长回文串长度,\(r_i\) 表示以 \(i\) 为开头的最长回文串长度,答案即为 \(\max l_i+r_{i+1}\)

考虑 manacher;记新串 (如 aba \(\rightarrow\) #a#b#a#) 上第 \(i\) 位的最长回文半径为 \(d_i\),其代表的最长回文串为 \([i-d_i+1, i+d_i-1]\),原串长度为 \(d_i\),我们令 \(l_{i+d_i-1} \leftarrow \max(l_{i+d_i-1}, d_i)\)\(r_{i-d_i+1} \leftarrow \max(r_{i-d_i+1}, d_i)\)

不过此时直接算答案会有问题;我们只是根据每位的最长回文串长度更新了 \(l_i, r_i\),没有覆盖到较短的回文串

比如 ababa \(\rightarrow\) #a#b#a#b#a#,以第 \(3\)a 为中心的回文串除了 #a#b#a#b#a# 还有 #b#a#b#,但我们只用前者更新了 \(l_i, r_i\)

因此我们还需要再进行一次递推;回文串向中间挪动一次会少 \(2\) 个字符,我们枚举每个字母的位置 \(i\),进行转移 \(l_i = l_{i+2}-2\)\(r_i = r_{i-2}-2\)

枚举每个 # 的位置 \(i\),答案即为 \(\max (l_{i-1}+r_{i+1})\)

P2870

朴素贪心思路是比较两头字典序,若相同则暴力往中间挪

可以使用哈希优化这一过程,二分头尾最长相同串的长度,做到 \(O(n \log n)\)

P9873

114514 串太复杂了,考虑简化为 1, 14, 5, 14

posted @ 2025-03-04 18:56  lzlqwq  阅读(33)  评论(0)    收藏  举报