Description
给定一个包含 n n n个节点的无向树T。
现在,请你求出,对于所有 n n n个节点构造得到的无向树P,使得P与T的公用边的数量恰好为 k k k的方案数。
你需要对于 k = 0 , 1 ⋯ n − 1 k=0,1 \cdots n-1 k=0,1⋯n−1分别输出答案,并将它们对 1 0 9 + 7 10^9+7 109+7取模。
Solution
朴素做法
根据生成函数的思想,我们可以对于给定的无向树T的每条边都赋予一个形如 x + 1 x+1 x+1的多项式。那么对于当前的 k k k的答案,就是所有生成树的边权之积的和的 k k k次项的系数。
于是我们直接大力Matrix Tree定理套NTT即可。
时间复杂度 O ( n 4 log n ) O(n^4 \log n) O(n4logn),且常数很大。
正解做法
考虑如何优化上面这个“套”。
不难发现,最终的多项式一定是一个 n − 1 n-1 n−1次多项式。所以, n n n个点值即可唯一确定这个多项式,于是我们考虑让 x x x代表一个数而非无意义的形式幂级数,分别执行一次Matrix-Tree定理最终再高斯消元回去得到多项式的各项系数即可。
更具体的说,枚举 x = 1 , 2 ⋯ ⋯ n x=1,2 \cdots \cdots n x=1,2⋯⋯n。对于当前的 x x x,我们给每条在T中的边一个权值,即 x + 1 x+1 x+1。然后我们构造出Matrix-Tree定理中的矩阵,跑一遍高斯消元。最后我们再将点值表示转换为系数表示,于是我们就得到了朴素做法中的答案多项式的各项系数。
不难发现,时间复杂度为 O ( n 4 ) O(n^4) O(n4)。常数不大。
Summary
遇事不决,生成函数。
套多项式,巨大常数。
考虑点值,逐一求出。
高斯消元,正解欲出。