https://codeforces.com/contest/1326/problem/F2
对于长度为 \(N-1\) 的二进制串 \(s\),先算出 \(f(s)\) 表示为 \(1\) 的位置必定有边,为 \(0\) 的位置可能有边的方案数。原问题的答案可以通过容斥算出。
注意到 \(f(s)\) 的值只与 \(s\) 中 \(1\) 的所有连续段长度形成的多重集有关,而 \(n=18\) 时不同的多重集只有 \(385\) 个(A000041),可以对每个多重集算 \(f(s)\)。记这个多重集内的段长度为 \(a_1,a_2,\ldots,a_k\:(a_1+a_2+\ldots+a_k=N)\),那么
其中 \(g(m)\) 是用 \(m\) 集合内的人形成链的方案数,且所有 \(m\) 或起来是全集。直接暴力算是 \(O(3^N)\) 的。
继续优化,我们想要让每一个人都恰好被一个 \(m_i\) 包括,这个可以继续容斥。考虑记 \(g(l,m)\) 为用 \(m\) 的一个子集形成长度为 \(l\) 的链的方案数,那么
这样就不用子集 DP 了。
原文:https://www.cnblogs.com/iefnah06/p/12634033.html