(非)人类题选做
[AGC072C] Human Exercise
这真是 Human 能作出来的观察???
让我们充分发挥注意力,对位于上三角的点 \((i,j)\)(\(i+j\le n\)),每次走到 \((i,j)\),写下此时向下走(D)还是向右走(R),得到一个序列。这序列是先 \(i\) 个 D 再 \(j\) 个 R 循环。
递推求出每个点被经过的次数 \(f_{i,j}\)。
对于下三角(\(i+j>n\)),注意到 \(f\) 关于左上和右下是对称的。
[AGC072A] Rhythm Game
半年前曾尝试过这题,拼尽全力无法战胜。半年后再尝试,拼尽全力终于得以战胜。
(是不是因为半年前瞄过一眼题解啊)
经过一番转化之后相当于是:
有一个数轴,初始位于点 \(0\),数轴上有 \(n\) 个区间,区间的长度是一个定值 \(d\)。当你在一个区间 \([t_i,t_i+d]\) 里,你可以选择往后跳 \(l_i\) 步。问是否能够不重不漏地在所有区间都跳一次。
先将所有区间按照 \(t_i\) 排序。最优策略并不一定是按照顺序依次地选择,存在一种情况:
[ ] +114514
[ ] +1
这时候贪心地选择截止时间靠前的那个区间是不对的。
考虑 dp,设 \(f_i\) 表示已经跳了一个前缀 \([1,i-1]\),到 \(i\) 的时间最小是多少。
第一种情况,跳 \(i\),转移到 \(f_{i+1}\);
第二种情况,先跳 \([i+1,j]\),然后跳 \(i\),转移到 \(f_{j+1}\)。
[AGC068A] Circular Distance
这个题还是很人类的。
[AGC071B] Maximum Bracket Subsequence
[AGC066E] Sliding Puzzle On Tree
这题好像大家都做过原题场上过穿了,所以评分只有 3000?
先想一些性质:
- 记 \(k\) 的答案为 \(f(k)\)。则 \(C(n,k)\mid f(k)\),于是只用求 \(f'(k)=f(k)/C(n,k)\),也就是不同顺序。这里的顺序的指的是想象把这些棋子拉到一条链上,产生的不同的顺序。
- 设 \(l\) 为直径长度。先考虑 \(k\le l\),这个时候只需要假设把棋子都移到了直径上的前 \(k\) 个点。
- 我们不妨把所有点事先拉到直径上,然后考虑第 \(i\) 颗棋子和第 \(i+1\) 颗棋子能否交换位置。
- 现在开始大分讨!
- 先别分讨了,假设已经能求出来第 \(i\) 颗棋子和第 \(i+1\) 颗棋子能否交换位置,计算答案是简单的。对于 \(k>l\),应该也比较简单。
[AGC065D] Not Intersect
组合意义太深刻了。
没有重边太麻烦了,先上二项式反演,钦定 \(m\) 个可重。
考虑组合意义:
有一个栈,从 \(i=1,...,n\),先 push 若干个,再 pop 若干个,任意时刻 pop 的个数不能超过 push 的个数,且最后栈为空,一共 push 了 \(m\) 个。这个新问题和原问题是双射。
考虑在坐标系上,初始位于 \((0,0)\),然后依次走 \(n\) 次,每一次先向上走若干步,再向右走若干步,经过 \(n\) 次后走到 \((m,m)\),途中不能越过 \(y=x\)。
设拐点的坐标依次为 \((x_0,y_0)=(0,0),(x_1,y_1),...,(x_{n-1},y_{n-1})=(m,m)\),要求的是:
- \(x_i\le y_i\)
- \(x_i\le x_{i+1}\)
- \(y_i\le y_{i+1}\)
可以想象到有一个 \((n-2)\times m\) 的网格,从 \((0,0)\) 到 \((n-2,m)\) 走两条路线,要求第一条在第二条上面(可以贴着)。
设 \(f(n,m)\) 为从 \((0,0)\) 到 \((n,m)\) 的方案数。
这是可以用 LGV 引理 \(O(1)\) 计算的。或者也可以推式子:
枚举有 \(i\) 次走了 \(UR\),则也有 \(i\) 次 \(RU\),\(n-i\) 次 \(UU\),\(m-i\) 次 \(RR\),则方案数为
其中 \(H_{2n}=C(2n,n)/(n+1)\) 是卡特兰数。
最后也是最关键的一步,这个 \(m>2\times 10^7\),\(n=1\),\(m=0\) 或 \(n=2\)(尤其是 \(n=2\))也太坏了,大家一定不要忘了判掉!
[AGC068E] Sort and Match
这东西竟然是多项式的,这题真无敌了!
考虑如果 \(p\) 是排列则等价于计算积和式,这个是经典的 NPC 问题。
这里搬来 Kubic 老师的 WC 讲题课件。
- 暂不考虑 \(x_1=k\) 的限制。对于每个 \(i\),将二元组 \((x_i, y_i)\) 看作有向边 \(y_i → x_i\)。
- 显然为欧拉图,且每个点出边有顺序,与 BEST 定理有相似之处,因此考虑转化为有向图游走。
- 令当前所在点为 \(u\),初始 \(u = 1\)。考虑如下过程:
- 若 \(u\) 的所有出边均已被访问:若 \(u = n\) 则终止过程,否则移动到 \(u + 1\)。
- 否则找到 \(u\) 的编号最小的未被访问的出边 \(u → v\),移动到 \(v\)。
- 因为每个点入度出度相同,所以最终所有边都会被访问。而访问方案与序列 \(x\) 一一对应。
- 对于游走的方案设计 dp 即可。具体地,令 \(dp_{u,x,c}\) 表示当前所在点为 \(u\),当前回路的起点为 \(x\),共经过 \(c\) 条边时的方案总权值和。
- 转移时选择一条出边 \(u → v\) 并移动到 \(v\)。若 \(u = x\) 可能出现 \(u\) 无出度的情况,此时有第二种转移,移动到 \(u + 1\)。时间复杂度 \(O(n^4)\)。
- \(x_1 = k\) 的限制相当于要求编号最小的出边到达点为 \(k\)。将过程倒置,最后一步特殊转移即可。时间复杂度依然为 \(O(n^4)\)。
[AGC055F] Creative Splitting
神题,但也不是完全不可战胜。
还是和上一道题一样,暂时忽略 \(a_x=y\) 的限制。
考虑一个序列 \(a_1,...,a_{nk}\) 的判定方法。维护一个列表 \(p_1,...,p_n\),初始时为 \(k,k,...,k\)。然后倒着加入每个数,找到最小的 \(j\) 使得 \(p_j\ge a_i\),并将 \(p_j-1\to p_j\)。合法当且仅当最后时刻列表时 \(0,0,...,0\)。
那么根据这个判定,考虑进行 \(nk\) 次,每一次选择 \(1\le i\le n\) 使得 \(p_{i-1}<p_i\),并将 \(p_i-1\to p_i\),执行这个操作的方案数是(操作之前的) \(p_i-p_{i-1}\)。
维护差分(长度为 \(n\),总和为 \(k\))\(c_i=p_i-p_{i-1}\),那么相当于 \(nk\) 次,选择 \(1\le i\le n\),将 \(c_i-1\to c_i,c_{i+1}+1\to c_{i+1}\),方案数是(操作之前的) \(c_i\)。
到这里已经非常明显了,如果不考虑 \(a_x=y\) 的限制,那么答案就是 \(C(nk,n,n,n,...)\)。
可以想象有 \(k\) 个球和一个长度为 \(n\) 的木板,球初始在位置 \(1\) 处。每一次选择一个球并将其向前移动一步,进行 \(nk\) 步后所有球都到达 \(n+1\),这个的方案数是 \(C(nk,n,n,n,...)\)。
现在考虑添加限制 \(a_{n+1-x}=y\),枚举实际上操作的是 \(p_t\)(\(1\le t\le n\))。
那么写出限制,
容斥,然后分别考虑两种限制。
不妨先考虑 \(c_1+...+c_t\ge y\)。
再解释到组合意义上,相当于我们要求在第 \(x\) 次操作执行之前,\(1,...,t\) 处至少有 \(y\) 个球,并在这一步,强制使一个位于点 \(t\) 的球移到 \(t+1\)(任意一个,顺序不定,方案数为 \(1\))。注意,由于上面的限制,点 \(t\) 上至少有一个球。
对球这一维度做 dp,设 \(f_{i,j,k,0/1}\) 表示考虑前 \(i\) 个球,有 \(j\) 个球(在第 \(x\) 次操作前)位于 \(1...t\),移动的步数总数为 \(k\),以及有没有强制移动。
这样复杂度为 \(O(n^6)\)(视 \(n,k\) 同阶)。
另一种 dp 方法是不记录 \(j\) 这一维度,而是分成两部分合并。虽然 dp 的复杂度降低为 \(O(n^5)\),但是瓶颈在合并算答案的时候复杂度仍然是 \(O(n^6)\)。
[AGC043D] Merge Triplets
考虑如果每一个三元组 \((x,y,z)\) 都有 \(x<y<z\),那么生成出来的排列是固定的 \(1...n\)。
否则考虑如果 \(y<x\),那么删除 \(x\) 后下一个就会立即删除 \(y\)。
这启发我们考虑生成的排列相邻的大小关系。
如果出现了 \(p_i>p_{i+1}\) 且 \(p_i>p_{i+2}\),则说明 \(i,i+1,i+2\) 属于同一个三元组,假设这种结构有 \(x\) 个。
如果 \(p_i>p_{i+1}\) 且 \(p_i<p_{i+2}\),则说明 \(i\) 和 \(i+1\) 属于同一个三元组,这种结构假设有 \(y\) 个。
假设还有 \(z\) 个单点,则合法当且仅当 \(2y\le z\)。
改写成 dp 的形式,额外记录一维 \(2y-z\),大致就是一个钦定一些数的大小关系然后方案数是外向树拓扑序个数,公式 \(n!/\prod siz_i\)。
[PA Finals 2025] Directed Hanoi
队友经过手玩得到了一个很有道理的结论:排除 \(1\) 不可达和不可达 \(n\) 的点,答案是 \(\sum\min(ind_i,oud_i)\),获得了 wa on test 2 的好成绩。
不妨从一条链的情况入手,设 \(h_i\) 表示 \(i\) 个球至少需要 \(h_i\) 根柱子,转移形如 \(h_i=\min\max(2h_j,h_{i-j}+1)\)。
设 \(f_{i,j}\) 表示从 \(i\) 到 \(j\) 最多可以运送多少塔,对于 \(i\) 不可达 \(j\) 则 \(f_{i,j}=0\),否则转移式为 \(f_{i,j}=1+\sum_k f_{i,k}+f_{k,j}\)。
[AGC060D] Same Descent Set
考虑对于一个由 < 和 > 组成的长度为 \(n-1\) 的序列 \(a\),计算 \(f(a)\) 表示 \([p_i<p_{i+1}]=a_i\) 的排列个数,则总答案为 \(\sum_a f^2(a)\)。
考虑计算 \(f(a)\),设 > 的集合为 \(S\),容斥,则
\(g(T)\) 表示对 \(T\) 中的位置钦定无大小限制,其余为 <。
答案是
这样枚举的变量就只剩 \(T_1\) 和 \(T_2\) 了。
然后就是一些魔法的推导。
上式
最终的式子与最初看似没有差异,然而我们惊奇地发现它已经变成了一个可以 dp 的形式!
枚举 \(V\),则 \(V\) 中的位置可以看作已经断开了,相邻两段之间是互不影响的。设 \(f_i\) 表示长度为 \(i\) 的链任选 \(T\) 断开的 \(g(T)/(-2)^{|T|}\) 之和,\(g_i\) 表示上述式子的值,容易写出转移式。剩下的事情就是多项式板子了。
使用分治多项式乘法可以做到 \(O(\log^2 n)\),若使用多项式 exp 可以做到 \(O(\log n)\)。
具体写一下学习多项式的笔记。
多项式求逆
假设要求出 \(G\) 使得 \(FG\equiv 1\pmod {x^n}\)。
先把 \(n\) 扩展为 \(2^k\),然后考虑增量,假设已经求出了 \(G\equiv G'\pmod {x^n}\),如何推出 \(G\bmod{x^{2n}}\)。
两边同乘 \(F\),$$G+G'^2F-2G'\equiv 0\pmod{x^{2n}}$$,也就是
注意多项式的
注意 \(|U|=n-1\)。
CF1034E Little C Loves 3 III
\(O(n2^n)\) 的模 4 意义下子集卷积。
pt 推的题,非人类。
或卷积的 \(O(n2^n)\) 的复杂度看起来就不太能舍去。
普通子集卷积需要一个占位符 \([x^a]\) 其中 \(a\in [0,n]\) 用来记录集合大小。考虑使用 \(4^a\) 来占位,并在整数域上作或卷积得到一个多项式 \(F(x)\)。
假设作出贡献的两项的 popcount 分别是 \(a\) 和 \(b\),贡献到的 popcount 为 \(c\),显然 \(a+b\ge c\)。给 \(F(x)\) 除去 \(4^{c}\) 后,再 \(\bmod 4\),这样若 \(a+b\ge c+1\),在模 4 意义下贡献为 0。
上述做法需要一个精度,事实上 \(2^64\) 是足够的。更一般地,假设模数为 \(p\),在本题中 \(p=4\),则大致需要的精度是 \(p^{\log_2n}p^2n\),在本题中刚好等于 \(2^{64}\)。
从理论的角度来看,记模 2 意义下的子集卷积复杂度为 \(F(n)\),普通子集卷积的复杂度为 \(G(n)\),则 \(G(n)\le O(n)F(n)\),因为 \(G(n)=O(n^22^n)\),因此 \(F(n)\) 大概是 \(O(n2^n)\) 的级别。
和谐
模拟赛题。
愿与愁
模拟赛题。
如何线性筛出 \(n^n\):
线性筛把一个数分解为 \(n=pq\),其中 \(p\) 是 \(n\) 的最小质因子,有 \(p\le \sqrt n\)。
\((pq)^{pq}=(p^p)^q (q^q)^p\)。前者对于每个素数 \(p\) 预处理出 \(n/p\) 次的光速幂,后者考虑从 \((q^q)^{p_1}\) 递推到 \((q^q)^{p_2}\),也就是多了 \((q^q)^{p_2-p_1}\)。注意到 \(p_2-p_1\) 是 \(O(\ln n)\) 级别的,因此直接快速幂来求的时间复杂度为 \(O(n\log\log n)\)。注意到对于一个 \(q\),\(\max_{p_i-p_{i-1}}\) 大致是 \(O(\ln{n/q})\) 量级。求和得到 \(\sum_q \ln{n/q}=O(n)\)。有个公式 \(\ln(n!)=n\ln(n)-n+O(1)\)。
对于前者求和得到 \(\sum_p \sqrt{n/p}=\sqrt n\sum_p\sqrt{1/p}\)。

浙公网安备 33010602011771号