省選聯考 2024 重塑時光

zhouhuanyi發表於2024-03-10

首先原問題顯然是一個 \(\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\) 和常數其實差不多。

相關文章