A 比较简单就不放了,这样刚好是全是数数题
F 先咕咕咕一会。
B
link
其实就是对于所有 \(P_i>i\) 的 \(i\) 到 \(P_i\) 连边,然后 \(A_i\) 就是 \(i\) 号点在的链上的最后一个点。
考虑集合 \(S_i=\{j\mid A_j=i\}\),显然如果需要有解那么 \(S_i\) 中最大值必定为 \(i\),而且这些点一定从小到大连成一条链,然后 \(P_i<i\) 不会连边。
由于 \(P\) 是一个排列,所以此时 \(P_i\) 一定是另外一个集合里面最小的一个元素。
令所有 \(A_i=i\) 的 \(i\) 从小到大排序依次为 \(c_1,c_2,\dots,c_m\),\(p_{c_i}\) 能取到的合法的个数为 \(d_i\)。
对于 \(i\le j\),我们注意到 \(d_i\le d_j\) 并且这 \(d_j\) 个数是严格包含 \(d_i\) 个数字的。
考虑乘法原理,显然需要从限制更加严格的开始考虑,那么答案就是 \(\prod(d_i-i+1)\)。
实际上 \(d_i\) 只需要开个桶扫一遍就能得到了。
\(O(n)\)
https://atcoder.jp/contests/arc171/submissions/50008176
C
link
引理1:两次操作的边集不同,那么最后得到的 \(a\) 不同。
证明:对于任意一条边,考虑断掉这条边,构成的两个点集上 \(a\) 组成的集合。注意到只有在对这条边操作时两边的集合会改变,所以两个方案中有一条边操作了另外一条边没有操作那么最后的 \(a\) 一定不同。
引理2:对于两次操作,如果操作的边集相同,如果对于任意点,当且仅当与这个点相连的所有操作过的边的相对顺序都相同,这两次操作得到的 \(a\) 是一样的。
证明:考虑归纳法。如果操作仅有一条边或者没有操作显然成立。考虑新增一个边 \((u,v)\),这条边与不和 \(u,v\) 两点相连的边的出现顺序对答案没有影响,与 \(u,v\) 两点相连的边出现顺序一定有影响,得证。
根据上面的引理,假设与 \(u\) 相连的点有 \(deg_u\) 被操作,那么答案就是 \(\prod(deg_u!)\)。
设 \(g_{u,0/1}\) 为 \(u\) 这个子树与父亲相连的边没有操作/操作的方案数。
对于每次转移设 \(f_{i,j}\) 为 \(i\) 这个子树目前 \(j\) 个儿子向它连边的方案数。
使用 \(O(n^2)\) 树形 DP 即可。答案显然是 \(g_{root,0}\)。
https://atcoder.jp/contests/arc171/tasks/arc171_c
D
link
注意到 \(P\) 是质数,所以 \(\operatorname{hash}(A_l,A_{l+1},\cdots,A_r)\not=0\) 等价于 \(\operatorname{hash}(A_l,A_{l+1},\cdots,A_n)\not=\operatorname{hash}(A_r+1,A_{r+2},\cdots,A_n)\)。
每个后缀看成一个点,要求不相同的两两连边,就变成 \(N+1\) 个点(注意空后缀)染 \(P\) 种颜色要求每条边相邻的点颜色不同。
状压,先算出每个点集是不是独立集,为了方便记 \(g(S)=[\texttt{点集} S \texttt{是独立集}]\),\(f(S)}\) 为给集合 \(S\) 的元素染色需要最少的颜色数量。显然 \(f(\varnothing)=0\)。
\(O(3^n)\)。
https://atcoder.jp/contests/arc171/submissions/50404418
E
link
考虑观察样例研究一下这个性质。
注意到每次一定是横着跳竖着条循环往复然后回到原来的位置。所以 \(M\) 为奇数无解。
发现横着或者竖着跳不会互相影响,所以分开考虑最后乘起来再 \(\times 2\) 就是答案(第一次可以横着也可以竖着)。
考虑横着跳。
发现每次横着跳都会占用两个相邻的列。
由于起点是给定的,如果最后是从左边过来,那么起点应该在两个相邻的列中的左边,否则是右边。
我们注意到只有最后一次并不是任意选的。我们设最后一次可以从 \(i\) 个位置过来,那么如果圈定了列之后,总共有 \((m/2-2)!\times i\) 种方案。
考虑确定这 \(2m\) 列。除了起点所在的两个列需要分类讨论,其余的直接用捆绑法计算即可。
https://atcoder.jp/contests/arc171/submissions/50409834