loj6391

题意

\(n\)个点的树,初始有\(a,b\)两点是黑色的,其他是白色的,每次可以将某个与黑色节点相邻的某个白色节点染黑。一个方案不同当且仅当某一回合染黑的点不同。求将所有点染黑的方案数。对\(998244353\)取模。\(n,a,b\le 234567\)\(8s\)

做法

考虑若\(a=b\),将\(a\)置为根节点
\(f_i\)为若\(i\)节点为黑色,将\(i\)子树内的点全部染黑的方案数。令\(s_i\)\(i\)子树大小
显然有:\(f_i=(s_i-1)!\prod\limits_{v\in son_i}\frac{f_v}{s_v!}\Longrightarrow \frac{f_i}{s_i!}=\frac{1}{s_i}\prod\limits_{v\in son_i}\frac{f_v}{s_v!}\)。根据归纳显然有\(ans=f_1=\frac{n!}{\prod\limits_{i=1}^n s_i}\)

考虑\(a\neq b\),建一个虚点\(s\),连接\(a-b\),就形成了一棵基环树
题目等价于开始只有\(s\)一个黑点,然后染色。
枚举基环上的一条边,然后断开,方案数之和显然是原答案的两倍

考虑断开后,答案为\(\frac{(n+1)!}{(\prod\limits_{i=1}^n s_i)(n+1)}=\frac{n!}{\prod\limits_{i=1}^n s_i}\),不需要考虑虚点
\(s\)的变化实际只出现在基环上的点\(a_1,a_2,\cdots ,a_m\),令\(s_i\)为i节点不在基环上的子树大小,令\(x_i=\sum\limits_{k=1}^i s_i(s_0=0)\)
若将\(j,j+1\)断开,则子树乘积为\(|x_j-x_0|\times |x_j-x_1|\times \cdots \times |x_j-x_{j-1}|\times |x_j-x_{j+1}|\times\cdots \times |x_j-x_{m}|=\prod\limits_{i=0,i\neq j}^m|x_j-x_i|=(-1)^{m-j}\prod\limits_{i=0,i\neq j}^m(x_j-x_i)\)

构造多项式\(f(x)=\sum\limits_{j=0}^m \prod\limits_{i=0,i\neq j}^m(x-x_i)\),满足将\(f(x_j)=\prod\limits_{i=0,i\neq j}^m(x_j-x_i)\),发现\(f(x)=(\prod\limits_{i=0}^m (x-x_i))'\)

然后分治fft+多点求值即可

题外话

好久没打多项式了...码力好差...多项式求逆是\(mod~x^{n-1+m-1+m-1+1}\)

posted @ 2020-04-28 14:09  Grice  阅读(179)  评论(0编辑  收藏  举报