题面
给定一棵 \(n\) 个节点的树,每个点有个权值 \(a_i\),初始时 \(a_i=i\)。
你可以执行任意操作:选择一条边 \((u,v)\),交换 \(a_u\) 和 \(a_v\),并将这条边删掉。
问通过上述操作,最后 \((a_1,a_2,\cdots,a_n)\) 有多少种不同的排列方式,答案对 \(998244353\) 取模。
数据范围:\(n\le 3\times 10^3\) 。
题解
算是一个结论题,首先对于两个方案,如果连操作的边的集合都不相同,那么这两种方案得到的序列肯定不一样。
然后再看还有什么情况。对于两个方案,对于树上的每一个点 \(x\),如果点 \(x\) 周边要操作的边的相对相对顺序都一样,那么这两种方案得到的 \(a\) 就相同,否则就不同。
证明?大致是只要操作时两边的点权都相同,那么最终产生的 \(a\) 肯定相同。
所以考虑对于一种 操作的边的集合 计算答案。
这里又是一个结论?就是无论怎么确定 \(x\) 周边的边的相对操作顺序,都可以找到一个总的边的操作顺序,因为对于边 \(a,b,c\) ,不会出现 \((a,b),(b,c),(a,c)\) 有相同端点,从而出现 \(t_a<t_b,t_b<t_c,t_a>t_c\) 的情况。
所以答案就是 \(\sum_{E}\prod_{i=1}^n deg_{i,E}!\),其中 \(deg_{i,E}\) 表示节点 \(i\) 在边集 \(E\) 中的度数。
然后考虑dp求答案,设 \(f_{x,i,0/1}\) 表示只考虑以 \(x\) 为根的子树中,与 \(x\) 相连的所有边中选了 \(i\) 条,且 \(x\) 与其父亲之间的边有没有断的方案数。有转移:
\[f_{x,i,0}\leftarrow f_{x,i,0}\cdot g_{y,0}+f_{x,i−1,0}\cdot i\cdot g_{y,1}\\ f_{x,i,1}\leftarrow f_{x,i,1}\cdot g_{y,0}+f_{x,i−1,0}\cdot i\cdot g_{y,1} \]启发
- 对于题面问题,考虑求最终方案数时,关键是看每一条边操作时两点的点权。
- 在考虑是否存在一个排列,并且满足一些数的相对大小时,看会不会出现 \(t_a<t_b,t_b<t_c,t_a>t_c\) 就行了。