M

分类讨论一下,下面下标为 11 base 的。

如果 ss 是全 00 串,那么答案是 00;否则找到第一个 11 的位置,假设这个位置是 pp。

  1. 若 p=1,2p=1,2,当 nn 充分大的时候,选择 n−1n-1 位置一定会使得答案至少有 n−p−1n-p-1 位;

    可能比 n−1n-1 位置更优的只有 p+1p+1 位置,所以只需要把开头和结尾附近取几个位置 O(n)O(n) 算一下即可。

    当 nn 比较小的时候,直接 O(n2)O(n^2) 暴力即可。

  2. 若 p≥3p\ge 3,选择 2∼p−12\sim p-1 的位置都是一样的,选 pp 右边的情况同上。

复杂度 O(n)O(n)。

B

观察到每一坐标我们切的位置都是固定的,例如 xx 坐标我们只能按照 n/(p+1)n/(p+1) 个一组的方式去切,并且在两组缝隙间移动并不会改变最终分组的结果。

所以我们只需要给每一个人打好它位于哪一组的标记,最后看所有组是否都真的平分了即可。

由于答案想要合法,必须有 (p+1)(q+1)(r+1)∣n(p+1)(q+1)(r+1)\mid n,因此这三个东西乘起来是不超过 nn 的,可以直接混合进制的方式去记录每一组。

复杂度 O(nlog⁡n)O(n\log n),瓶颈在于排序。

G

令 kk 是满足 2k>b2^k>b 的最小的 kk,那么我们可以在模 m=lcm⁡(2k,b)m=\operatorname{lcm}(2^k,b) 意义下去做同余最短路。

从原理上来讲,设 dpudp_u 表示到达 x≡u(modm)x\equiv u\pmod m 时 xx 的最小值,有转移式:

dpu⊕b←min⁡(dpu⊕b,dpu⊕b)dp(u+b) mod m←min⁡(dp(u+b) mod m,dpu+b)\begin{aligned} dp_{u\oplus b}&\gets \min(dp_{u\oplus b}, dp_u\oplus b)\\ dp_{(u+b)\bmod m} &\gets \min(dp_{(u+b)\bmod m},dp_u+b) \end{aligned}

为什么这仍然是一个最短路的形式?因为 dpu⊕bdp_u\oplus b 实际上可以看作 dpu+b−2(dpu∧b)=dpu+b−2(u∧b)dp_u + b-2(dp_u\land b)=dp_u+b-2(u\land b),这是因为 dpu≡u(modm)dp_u\equiv u\pmod m,而 2k∣m2^k\mid m,所以 b∧dpu=b∧ub\land dp_u=b\land u。

即 uu 到 u⊕bu\oplus b 的这条边权并不依赖于 dpudp_u 的具体值,所以这是一个最短路的形式。

假设我们求出了所有 dpdp 值,那么 dpc mod m≤cdp_{c\bmod m}\le c 就是能到达 cc 的充要条件:如果 dpc mod m>cdp_{c\bmod m}>c,说明到达 c mod mc\bmod m 这个等价类的最小值比 cc 大,那么 cc 不可达;如果 dpc mod m≤cdp_{c\bmod m}\le c,那么我们最后再加若干倍的 bb 就可以到达 cc。

现在的问题在于,这个图具有负权边。直接 SPFA 也是可以通过的,因为图形状特殊,出题人造不出卡掉 SPFA 的数据。

但是仍然可以进行 Dijkstra,只不过我们需要修改边权。观察到不会进行连续两次异或,所以我们把第一种边改成 u→((u⊕b)+b) mod mu\to ((u\oplus b)+b)\bmod m,最后检查 c mod mc\bmod m 和 c⊕b mod mc\oplus b\bmod m 即可,这样就没有负权边了。

这是一个 mm 个点,2m2m 条边的图,复杂度 O(mlog⁡m)O(m\log m),其中 m=O(b2)m=O(b^2)。

J

根据经典结论,对 Sn=⨁i=1niS_n=\bigoplus_{i=1}^n i 有 S4k−3=1,S4k−2=4k−1,S4k−1=0,S4k=4kS_{4k-3}=1,S_{4k-2}=4k-1,S_{4k-1}=0,S_{4k}=4k。

那么 x⊕(x+1)⊕(x+2)⊕(x+3)=Sx+3⊕Sx−1x\oplus (x+1)\oplus (x+2)\oplus (x+3)=S_{x+3}\oplus S_{x-1},那么当 xx 为偶数时,这个值为 00;xx 为奇数时,这个值为 (4k−1)⊕(4k+3)(4k-1)\oplus (4k+3) 或者 4k⊕(4k+4)4k\oplus (4k+4),总之不等于 00。

而 ci,j⊕ci,j+1⊕ci+1,j⊕ci+1,j+1c_{i,j}\oplus c_{i,j+1}\oplus c_{i+1,j}\oplus c_{i+1,j+1} 代入定义后应该为 00,因此 xx 一定是偶数。

既然 xx 为偶数,那么 x+1=x⊕1x+1=x\oplus 1,x+3=(x+2)⊕1x+3=(x+2)\oplus 1,所以 bj⊕bj+1=1b_j\oplus b_{j+1}=1 即可满足两列间的关系。

在选择这样的 bjb_j 的前提下,我们只需要满足 ci+1,j=ci,j+2c_{i+1,j}=c_{i,j}+2 即可,那么 ci+1,j⊕ci,j=ai⊕ai+1c_{i+1,j}\oplus c_{i,j}=a_i\oplus a_{i+1},那么我们可以根据 ai⊕ai+1=x⊕(x+2)a_i\oplus a_{i+1}=x\oplus (x+2) 推断出 xx 应该是什么样的。

具体地说,由于 xx 是偶数,设 xx 的二进制从低到高位是 x0x1x2…xpxp+1x_0x_1x_2\dots x_px_{p+1},其中 x0=0,x1=x2=⋯=xp=1,xp+1=0x_0=0,x_1=x_2=\dots=x_p=1,x_{p+1}=0,即它从第 11 位开始有 pp 个 11,那么 x⊕(x+2)x\oplus (x+2) 就是 2p+2−22^{p+2}-2,其中 p≥0p\ge 0。

那么我们根据 ai⊕ai+1a_i\oplus a_{i+1} 可以得到 pp,此时就只剩下要求 xx 的 0∼p+10\sim p+1 位符合我们的要求。

只需要查询符合要求的 bjb_j 的数量即可,我们可以用哈希表对 bb 的每一种前缀二进制位开桶。

复杂度 O(nlog⁡V)O(n\log V)。

I

设 Ai={g(pi)}A_i=\{g(p_i)\},令 cgc_g 表示 g(p)=gg(p)=g 的 pp 的数量,即求:

E[∣⋃i=1kAi∣]=∑∅≠T⊆[k](−1)∣T∣−1E[∣⋂i∈TAi∣]=∑∅≠T⊆[k](−1)∣T∣−1Pr⁡(AT1=AT2=⋯=AT∣T∣)=∑∅≠T⊆[k](−1)∣T∣−11(n!)∣T∣∑gcg∣T∣=∑t=1k(kt)(−1)t−11(n!)t∑gcgt\begin{aligned} \mathbb E\left[\left|\bigcup_{i=1}^k A_i \right|\right]&=\sum_{\varnothing\neq T\subseteq [k]} (-1)^{|T|-1}\mathbb E\left[\left|\bigcap_{i\in T} A_i \right|\right]\\ &=\sum_{\varnothing\neq T\subseteq [k]}(-1)^{|T|-1} \Pr(A_{T_1}=A_{T_2}=\cdots=A_{T_{|T|}})\\ &=\sum_{\varnothing\neq T\subseteq [k]}(-1)^{|T|-1} \frac{1}{(n!)^{|T|}}\sum_{g} c_g^{|T|}\\ &=\sum_{t=1}^k \binom{k}{t}(-1)^{t-1} \frac{1}{(n!)^{t}}\sum_{g} c_g^t \end{aligned}

记 st,is_{t,i} 表示长度为 n=in=i 时,st,i=∑gcgts_{t,i}=\sum_g c_g^t。

打表程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
vector<int> get_g(vector<int> p) {
int mx = -1;
vector<int> ret;
for (int x: p) {
if (x > mx) ret.push_back(x);
mx = max(x, mx);
}
sort(ret.begin(), ret.end());
return ret;
}

void solve() {
int n;
cin >> n;
vector<int> p(n);
iota(p.begin(), p.end(), 1);

map<vector<int>, int> c;
do {
auto g = get_g(p);
c[g]++;
} while (next_permutation(p.begin(), p.end()));

cerr << "n=" << n << "\n";
for (auto [_, cg]: c) {
cerr << cg << " ";
}
cerr << endl;
}

这里贴出部分输出:

1
2
3
4
5
6
7
8
9
10
11
12
n=1
1
n=2
1 1
n=3
1 1 2 2
n=4
1 1 2 2 3 3 6 6
n=5
1 1 2 2 3 3 6 6 4 4 8 8 12 12 24 24
n=6
1 1 2 2 3 3 6 6 4 4 8 8 12 12 24 24 5 5 10 10 15 15 30 30 20 20 40 40 60 60 120 120

可以观察出,当 n←i+1n\gets i+1 时,相当于所有 cgc_g 乘 ii 拼到原本的 cgc_g 后面,那么 st,i+1=(1+it)st,is_{t,i+1}=(1+i^t)s_{t,i}。

复杂度 O(nk)O(nk)。

D

简单引入一下本题需要的结论。

假设 A,BA,B 是一对直径端点,定义 ecc⁡(x)\operatorname{ecc}(x) 表示点 xx 到最远点的距离,那么 ecc⁡(x)=max⁡(d(A,x),d(B,x))\operatorname{ecc}(x)=\max(d(A,x),d(B,x)),这里不对这个结论证明。

现在我们关心 arg⁡min⁡xecc⁡(x)\arg\min_x \operatorname{ecc}(x),设以 xx 为根时 u=lca⁡(A,B)u=\operatorname{lca}(A,B),那么 d(A,x)=d(x,u)+d(u,A)d(A,x)=d(x,u)+d(u,A) 且 d(B,x)=d(x,u)+d(u,B)d(B,x)=d(x,u)+d(u,B),于是 ecc⁡(x)=d(x,u)+max⁡(d(u,A),d(u,B))\operatorname{ecc}(x)=d(x,u)+\max(d(u,A),d(u,B))。

想要让 ecc⁡(x)\operatorname{ecc}(x) 最小,一定有 d(x,u)=0d(x,u)=0,即 A,BA,B 经过 xx;那么又因为 d(u,A)+d(u,B)=Dd(u,A)+d(u,B)=D,其中 DD 为直径,所以:

  1. 当 DD 为偶数时,arg⁡min⁡xecc⁡(x)\arg\min_x \operatorname{ecc}(x) 唯一处于 ABAB 中点;
  2. 当 DD 为奇数时,arg⁡min⁡xecc⁡(x)\arg\min_x \operatorname{ecc}(x) 唯二处于 ABAB 中间边的两侧。

假设我们选定了 A,BA,B,那么这个点是唯一/唯二确定的。此时我们再选择别的直径,可以得到同样的结论,但是点本身已经被确定了,所以这些直径交于一点或一边。

  1. 当 DD 为偶数时,我们以这个唯一点 uu 为根,先一遍 DFS 找到所有直径端点,假设有 tt 个,那么我们给这些直径端点分配 1∼t1\sim t 就能逼迫程序选择 tt 作为起点并且到达 uu,因此前半部分答案就是 t,t+1,…,t+D/2t,t+1,\dots, t+D/2。

    此时从 uu 出发,我们只需要枚举最终走的所有可能情况就行了,并且对答案进行一个动态的更新。

    具体地说,由于程序一定会选择存在直径端点的子节点走,我们想逼程序走这里,设 c=c= 当前节点存在直径端点的子节点的数量,并且之前已经分配了 xx 个值,那么就给你想逼迫的节点分配一个 x+cx+c 即可。

    注意如果已经走到叶子,那么此时就不是 x+cx+c 而是 cc,这是因为我们一开始就给直径端点分配了 1∼t1\sim t。

    在进行枚举的过程中,我们需要动态更新最优的字典序。设当前位置为 pp,当它优于之前的最优值时,我们需要给 p+1∼Dp+1\sim D 重新赋为无穷,这样做是因为字典序的定义;当它与之前的最优值相等时,我们不进行操作;当他劣于时,我们直接剪枝。

    这里只需要用一个树状数组即可做到,赋值为无穷的操作我们只需要给 p+1∼Dp+1\sim D 区间加一个 INF 就可以做到。

  2. 当 DD 为奇数时,基本和偶数的情况完全相同,只不过需要两边都枚举一遍。

复杂度 O(nlog⁡n)O(n\log n)。

K

我这个题目一开始想打表,但是打表打出来的 pp 没有任何用处,结果是一个构造 + 交换论证法的贪心。

那怎么贪心呢?设当前放了若干个左括号,我们来看当前位置 ii 选择右括号还是选择左括号。

  1. 如果选择左括号,设当前栈顶是 (j,w,q)(j,w,q),表示上一个左括号的位置,它要求的右括号位置的值以及那个右括号最右边的下标。

    那么当前的合法位置就是 <q<q 且与 ii 奇偶性不同的下标,我们会选择合法位置中最小值 vv,如果有多个最小值则选择最右边的,设这个位置是 pp。

    如果真的这样选择了,那么我们会在栈中压入一个 (i,v,p)(i,v,p)。

    那么这样选择后,当前位置最终会是 vv。

  2. 如果选择右括号,设当前栈顶是 (j,w,q)(j,w,q),那么需要满足 ai=wa_i=w,i≤qi\le q,且 j,ij,i 奇偶性不同。

    那么这样选择后,当前位置最终会是 aja_j。

  3. 如果两种选择放到当前的值相等,我们会选择右括号,这样会让未来的约束更宽松;否则,我们选择更小的那个值。

主要的问题是,这样做真的能闭合掉所有左括号吗?答案是肯定的,因为栈顶会对你当前尝试放左括号进行很强的约束,你不可能到达它要求的位置之后还没有闭合掉这个左括号。并且我们每一个选择都做到了让未来最宽松。

复杂度 O(nlog⁡n)O(n\log n)。

H

设 E[Xi]\mathbb E[X_i] 为后缀 i∼ni\sim n 的期望得分,SS 为 cc 的后缀和,那么容易写出转移:

E[Xi]=∑ωPr⁡(ω)max⁡k=0lcp⁡(a,b){Si−Si+k+E[Si+k−Xi+k]}=∑ωPr⁡(ω)max⁡k=0lcp⁡(a,b){Si−E[Xi+k]}=Si−∑ωPr⁡(ω)min⁡k=0lcp⁡(a,b)E[Xi+k]\begin{aligned} \mathbb E[X_i]&=\sum_{\omega} \Pr(\omega)\max_{k=0}^{\operatorname{lcp}(a,b)}\left\{S_i-S_{i+k}+\mathbb E[S_{i+k}-X_{i+k}]\right\}\\ &=\sum_{\omega} \Pr(\omega)\max_{k=0}^{\operatorname{lcp}(a,b)}\left\{S_i-\mathbb E[X_{i+k}]\right\}\\ &=S_i-\sum_{\omega} \Pr(\omega)\min_{k=0}^{\operatorname{lcp}(a,b)}\mathbb E[X_{i+k}]\\ \end{aligned}

简化记号,记 fi=E[Xi]f_i=\mathbb E[X_i]。这个转移最难处理的地方在于 fif_i 自己依赖自己。

我们倒序进行 DP,此时 fi+1∼fnf_{i+1}\sim f_n 的值都是已知的,这相当于解一个关于 fif_i 的方程。

由于 fif_i 增大时,左式严格增大,右式非严格减小,所以一定是有唯一解的。

可以维护一个单调栈记录后缀的前缀最小值,枚举当前的值在单调栈的哪一个位置,解出来后判断它是否真的在这个位置即可。

此时还有一个问题,我们如何进行快速求值?即我们需要知道到达单调栈的一个位置时,它对应的概率。

设 pi=ci,ain−i+1p_i=\cfrac{c_{i,a_i}}{n-i+1},其中 ci,aic_{i,a_i} 表示 i∼ni\sim n 后缀中 aia_i 出现的次数,那么 lcp⁡(a,b)≥k\operatorname{lcp}(a,b)\ge k 的概率就是 ∏j=0k−1pi+j\prod_{j=0}^{k-1} p_{i+j}。

假设当前 ii 作为最小值一直管辖到 kk,并且 Vk=∑ωPr⁡(ω)min⁡pE[Xk+p]V_k=\sum_{\omega} \Pr(\omega)\min_p \mathbb E[X_{k+p}],那么就有:

fi=Si−(Vk∏j=ik−1pj+fi(1−∏j=ik−1pj))f_i=S_i-\left(V_k\prod_{j=i}^{k-1} p_{j}+f_i\left(1-\prod_{j=i}^{k-1}p_{j}\right)\right)

整理得到:

fi=Si−Vk∏j=ik−1pj2−∏j=ik−1pjf_i=\frac{S_i-V_k\prod_{j=i}^{k-1} p_j}{2-\prod_{j=i}^{k-1} p_j}

我们只需要在单调栈中记下当前位置到栈中下一个位置左闭右开的 ∏p\prod p 以及 VV 即可,注意这里千万不要记录后缀积,精度丢失很严重。

复杂度 O(n)O(n)。

C

设 dp(u,x,y)dp(u,x,y) 表示与 uu 子树中选择了 xx 个关键点,钦定 uu 是一个关键点,这些关键点中有 yy 个与 uu 相连。

定义 sus_u 表示 uu 子树的大小,拓展这个状态:

  • y=0y=0 时,认为 uu 不是关键点,并且此时 dp(u,x,0)=(su−1x)dp(u,x,0)=\binom{s_u-1}{x};

  • x=0x=0 时,认为这颗子树什么都不选,并且此时 dp(u,0,0)=1dp(u,0,0)=1,这是符合 y=0y=0 时的定义的。

  • y>xy>x 时,dp(u,x,y)=0dp(u,x,y)=0。

这主要是方便进行转移。设 uu 有 kk 个子节点 v1,v2,…,vkv_1,v_2,\dots,v_k,那么当 x>0,y>0x>0,y>0 时:

dp(u,x,y)=∑a1+⋯+ak=x−1∑b1+⋯+bk=y−1∏p=1kdp(vp,ap,bp)dp(u,x,y)=\sum_{a_1+\cdots+a_k=x-1}\sum_{b_1+\cdots+b_k=y-1} \prod_{p=1}^k dp(v_p,a_p,b_p)

看上去这是一个二重的树上背包,硬做应当是 O(n4)O(n^4) 的,无法通过。

观察如果我们知道了 dp(u,x,y)dp(u,x,y),如何求出答案。对于一个 pi=jp_i=j 的限制,我们计算答案 AA 时,先枚举选了几个关键点,再枚举相连的数量,再给子树中关键点分配 1∼j−11\sim j-1 的数值,非关键点分配 j+1∼nj+1\sim n 的数值,子树外边进行一个全排列即可:

A=∑x=1si∑y=1xdp(i,x,y)qy(j−1x−1)(n−jsi−x)(x−1)!(si−x)!(n−si)!=∑x=1si(j−1x−1)(n−jsi−x)(x−1)!(si−x)!(n−si)!(∑y=1xdp(i,x,y)qy)\begin{aligned} A&=\sum_{x=1}^{s_i} \sum_{y=1}^{x} dp(i,x,y)q_y\binom{j-1}{x-1}\binom{n-j}{s_i-x}(x-1)!(s_i-x)!(n-s_i)!\\ &=\sum_{x=1}^{s_i} \binom{j-1}{x-1}\binom{n-j}{s_i-x}(x-1)!(s_i-x)!(n-s_i)!\left(\sum_{y=1}^{x}dp(i,x,y)q_y\right) \end{aligned}

设 dp(u,x)dp(u,x) 维护第三维的多项式 dp(u,x)=∑ydp(i,x,y)zydp(u,x)=\sum_{y} dp(i,x,y)z^y,这里我们维护 z=1∼nz=1\sim n 的点值,那么当维护点值 z0z_0 的时候,转移就可以简写为:

dp(u,x)=∑a1+⋯+ak=x−1z0×∏p=1k((su−1ap)+dp(vp,ap))dp(u,x)=\sum_{a_1+\cdots+a_k=x-1} z_0\times \prod_{p=1}^k \left(\binom{s_u-1}{a_p}+dp(v_p,a_p)\right)

我们枚举每一个 z0z_0,然后做一个 O(n2)O(n^2) 的树上背包即可获取每一个 u,xu,x 在 z0z_0 处的点值。

注意我们的点值本身不包括 y=0y=0 的项,这是为了后面计算答案的时候方便。

那么我们现在枚举一个 u,xu,x 时,相当于知道了:

[1112⋯1n2122⋯2n⋮⋮⋯⋮n1n2⋯nn][dp(u,x,1)dp(u,x,2)⋮dp(u,x,n)]=[dp(u,x)z=1dp(u,x)z=2⋮dp(u,x)z=n]\begin{bmatrix} 1^1& 1^2& \cdots & 1^n\\ 2^1& 2^2& \cdots & 2^n\\ \vdots & \vdots & \cdots & \vdots\\ n^1&n^2&\cdots& n^n \end{bmatrix} \begin{bmatrix}dp(u,x,1)\\dp(u,x,2)\\\vdots\\dp(u,x,n)\end{bmatrix}= \begin{bmatrix} dp(u,x)_{z=1}\\ dp(u,x)_{z=2}\\ \vdots\\ dp(u,x)_{z=n} \end{bmatrix}

我们想要的值是 ∑y=1ndp(i,x,y)qy\sum_{y=1}^n dp(i,x,y) q_y,即:

[q1q2⋯qn][dp(u,x,1)dp(u,x,2)⋮dp(u,x,n)]\begin{bmatrix}q_1&q_2&\cdots&q_n\end{bmatrix} \begin{bmatrix}dp(u,x,1)\\dp(u,x,2)\\\vdots\\dp(u,x,n)\end{bmatrix}

所以我们只需要知道:

[q1q2⋯qn][1112⋯1n2122⋯2n⋮⋮⋯⋮n1n2⋯nn]−1\begin{bmatrix}q_1&q_2&\cdots&q_n\end{bmatrix}\begin{bmatrix} 1^1& 1^2& \cdots & 1^n\\ 2^1& 2^2& \cdots & 2^n\\ \vdots & \vdots & \cdots & \vdots\\ n^1&n^2&\cdots& n^n \end{bmatrix}^{-1}

即可,直接矩阵求逆即可,这是一个范德蒙德矩阵,它的行列式一定不为 00,所以逆一定存在。

求出这个向量后,我们每次 O(n)O(n) 就可以求出每一个答案。

复杂度 O(n3)O(n^3)。