给定一个元素个数为$n$的集合$c$和一个整数$m$,称一棵二叉树是好的当且仅当这棵二叉树的所有点的权值都属于$c$,规定一棵带点权二叉树的权值是该树中所有点权的总和。对于任意的整数$s$满足$1\leq s\leq m$,求出权值为$s$的好的二叉树的数量,答案对$998244353$取模。
$\texttt{Data Range:}1\leq n,m,c_i\leq 10^5$
链接
题解
一道很好的计数$\texttt{dp}$多项式花样板子题。
首先考虑计数$\texttt{dp}$,其实这个应该不难想。
考虑根节点的点权,枚举一下左子树点权,那么有
这里,$g_i=[i\in c]$。
但是这个算法复杂度不对啊qwq,考虑使用生成函数优化一下。
设$F(x)$为序列$dp$的生成函数(很明显是$\texttt{OGF}$),$G(x)$为序列$g$的生成函数,那么很明显的可以看到,上面的式子是卷积的形式,于是就再搞一搞,就会有
再整理一下
解一下这样一个方程,得到两个根
这个正负号看起来就觉得很不爽,所以考虑一下这个是加号还是减号。
题目保证了$1\leq c_i\leq 10^5$,所以可以知道$G_0=0$,代入一下是加号。
既然$F$是$dp$的生成函数,那么只需要输出$F_1,F_2,\cdots,F_m$就可以啦qwq。
时间复杂度$O(n\log n)$。
代码
1 |
|