NOIP模拟赛 #14
A
给定 \(n, a_{0\dots n - 1}\),满足 \(\forall i , |a_i - n|\le 1\)。对于 \(i \ge n\) 满足 \(a_i = \sum\limits_{j = 0} ^ {i - 1} [j + a_j \ge i]\),\(q\) 次询问给定 \(k\),求 \(a_k\) 的值。
\(1\le n, q\le 10^5, \ 0\le k\le 10^{15}\)
考虑 \(a_i \gets a_i - n + 1\),整个序列只有 \(0, 1, 2\) 三种取值。
发现每次相当于 \(2\) 在不断向后移动,找到第一个 \(0\) 匹配起来,我们可以用栈求出所有位置的匹配情况。
之后求答案,分类讨论即可。
B
一张图,每个点有实数点权 \(c_u\)。求一个简单环(点不重复),设 \(k\) 为环长,满足 \(k\ge 2\) 且环上所有点的点权之和 \(\ge \lfloor \frac k 2 \rfloor\),需要构造方案。
\(1\le n\le 500, \ 0\le m\le 2000, \ 0\le c_u\le 1\)
先 \(c_u \gets c_u - 0.5\),考虑 \(k = 2\),相当于一条边,这是容易的。
判完之后,发现图中不存在正环,并且连续走两条边权值和只减不增。
考虑枚举环上的一个点,然后跑 dij。
C
给定 \(n, \ A_{1\dots n, 1\dots n}\),求所有 \(x\) 满足存在一个排列 \(p\) 使得 \(\bigoplus_{i = 1} ^ n A_{i, p_i} = x\)。
\(1\le n\le 60, \ 0\le A_{i, j}< 2^{12}\)
考虑对每个 \(x^{A_{i, j}}\) 求 \(fwt(x^{A_{i, j}})\),这样拆成了 \(2^{12}\) 个矩阵,对每个矩阵求和积式,最后再 IFWT 即可。
仍然不好做。考虑到 FWT 和 IFWT 都是线性变换,所以最终 f_i 是一个 \(n^2\) 次 \(n\) 元多项式。
我们只关心 \(f_i\) 是否非零,考虑将和积式换成行列式,根据施瓦兹引理可知出错概率为 \(n / p\)。
D
给出 \(n, a_{1\dots n}, b_{1\dots n}\),有 \(n\) 个物品,和三个人。第一个人和第二个人取走物品的优先顺序为 \(a_{1\dots n}, b_{1\dots n}\),求确定第三个人取走物品的优先顺序 \(c_{1\dots n}\) 有多少种,满足一共取 \(\frac n3\) 轮物品,每轮每个人取走剩余物品中优先级最高的物品,满足不同人取走的物品不相同,答案对 \(10^9 + 7\) 取模。
\(1\le n\le 400, \ 3 | n\)
注意到我们只关心每一轮第三个人取走物品的方案,该轮被取走的其他两个物品的优先级任意,所以只需要在最终答案的基础上乘一个系数。
设 \(f_{i, j, k}\) 表示取了 \(i\) 轮,当前取走的物品中,最大的 \(j\) 满足第一个人的前 \(j\) 大优先的物品都已取走,最大的 \(k\) 满足第二个人前 \(k\) 大优先的物品都已取走,的方案数。
考虑二元组 \((j, k)\) 在经历了第 \(i\) 轮后的变化,首先是 \(j\gets j + 1, k\gets k + 1\)。然后不断检查 \(a_{j + 1}\) 是否被取,如果 \(a_{j + 1} \in \{b_1, b_2, \dots, b_k\}\) 那么 \(f_{i, j + 1, k} \xleftarrow{+} f_{i, j, k}, \ f_{i, j, k} \gets 0\),否则可能 \(a_{j + 1}\) 被第三个人取走,设 \(cnt\) 为 \(\{a_1, a_2, \dots , a_j, b_1, b_2, \dots b_k\}\) 集合大小,那么第三个人在 \(3i - cnt\) 次机会中任选一次取走 \(a_{j + 1}\),即 \(f_{i, j + 1, k} \xleftarrow{+} f_{i, j, k} \cdot (3i - cnt)\)。
\(k\) 同理。