Loading

省选联考 2024 重塑时光

首先原问题显然是一个 \(\text{DAG}\) 计数的形式,施加枚举 \(0\) 度点集合 \(S\) 容斥的技巧是自然的。考虑 \(k\) 刀将其切割成 \(t\) 段后最终找到一种标号使得存在一种重排方案使其合法的方案数。段内的方案计算是容易的,要求它们所有关系顺序即可,可以快速求出构成一个段的集合 \(S\) 的方案数 \(F_{S}\)。而我们要施加枚举 \(0\) 度点集合 \(S\) 容斥技巧,所以要将这些段在之间没有连边的情况下拼起来,记拼成 \(w\) 个段的方案数为 \(G_{w,S}\)。在枚举 \(0\) 度点容斥时只要记下来最终拼合成 \(e\) 个段的方案数为 \(H_{e,S}\),由于段可以任意排列,要乘 \(e!\),之后因为 \(k\) 刀将其分割成 \(e\) 个段的所有情况的概率相同,所以统计答案是容易的,直接这样可以得到一个 \(O(3^nn^2)\),看上去是不能通过 \(n\leqslant 15\) 的。

但接下来是一个有点"乱假成真,乱真成假"的事情了,由于答案是一个多项式,上述过程显然可以带点值最后拉插回来做到 \(O(3^nn)\)。这个是比上述做法优的,但笔者的考场代码反而还被卡常了,而不少经过卡常的 \(O(3^nn^2)\) 都过了(经过一定的观察,笔者发现在内存访问连续且可以并行运算的写法下,即写成多项式乘法的形式,实在是非常非常快,导致这种做法在 \(n=15\) 的情况下甚至比 \(O(3^nn)\) 的做法的实际运行时间更短)。笔者认为可能 \(n\) 要到更大的数据范围,比如 \(n=20\),可能才能体现出这种做法的优势,在本题的数据范围下 \(n\) 和常数其实差不多。

posted @ 2024-03-10 09:00  zhouhuanyi  阅读(50)  评论(0编辑  收藏  举报