https://www.luogu.com.cn/problem/P10881
神仙题啊。
首先可以选择一个环,然后缩掉环后就是一个树,可以使用矩阵树定理。复杂度 \(O(2^nn^3)\)。
考虑矩阵树定理的式子 \(\det(D-A)\),其中 \(A_{i,j}=a_i+a_j\),\(D\) 只在对角线上有值,然后发现 \(A\) 的秩 \(\le 2\),于是把行列式展开成 \(\sum\limits_{p} (-1)^{inv(p)}(D_{i,p_i}-A_{i,p_i})\),考虑括号选择 \(A_{i,p_i}\) 这一项的 \(i\) 的集合为 \(S\),则其余一定满足 \(i=p_i\),然后如果 \(|S|\ge 3\),由于 \(A\) 的秩 \(\le 2\),于是它的贡献为 \(0\)。于是满足 \(i\neq p_i\) 至多有两个,可以暴力枚举。
如果 \(|S|=1\),选择一个 \(i\),则贡献为 \(-2A_{i,i} \prod\limits_{j \neq i} D_{j,j}\),如果选择 \(i,j\),则贡献为 \((A_{i,i}A_{j,j}-A_{i,j}A_{j,i})\prod\limits_{z \neq i,j} D_{z,z}\)。把前面展开一下就是 \((2a_ia_j-a_i^2-a_j^2) \prod\limits_{z \neq i,j} D_{z,z}\)。
复杂度 \(O(2^nn^2)\)。
由于此时计算行列式的方式足够简单,所以可以塞到 dp 里,在 dp 时计算。接下来看一下怎么计算环,对于一个环,显然 \(a_i\) 会贡献 \(1,a_i,a_i^2\),然后显然贡献 \(a_i^2\) 的 \(i\) 数量和贡献 \(1\) 的数量相等,然后如果要把 \(0,1,2\) 三种指数排成一个环的话,相当于去除 \(1\) 之后 \(0,2\) 交替出现。然后这个方案数是容易的。
于是可以设计 \(f_{i,a,b,c,op}\) 表示 dp 到第 \(i\) 个数,钦定在环里的点指数为 \(0,1,2\) 的分别出现 \(a,b,c\) 个,\(op\) 表示行列式里 \((2a_ia_j-a_i^2-a_j^2)\) 的贡献状态,显然 \(op\) 的大小是 \(O(1)\) 的。
这样可以 \(O(1)\) 转移,复杂度 \(O(n^4)\)。