根据生成函数的基本知识,显然装 s 体积的方案数就是 [xs]n∏i=111−xVi
有一个想法是把分母拆出来分治 NTT,然而并不可做,因为次数太高。
于是这个时候就应该考虑先 ln 化乘法为加法再 exp 回去。
(于是做 n 次多项式求逆和多项式 ln 再加起来一遍多项式 exp 就完事了!)
显然并不能这么做……
于是就应该尝试发掘 ln11−xc 是否有什么性质。
求个导发现 (ln11−xc)′=(ln′11−xc)(11−xc)′=(1−xc)(11−xc)′=(1−xc)∞∑i=1ci⋅xci−1=∞∑i=1ci⋅xci−1−∞∑i=1ci⋅xc(i+1)−1=∞∑i=1ci⋅xci−1−∞∑i=1c⋅(i−1)⋅xci−1=∞∑i=1cxci−1
然后积分回来发现 ln11−xc=∫x0(ln11−tc)′dt=∫x0(∞∑i=1ctci−1)dt=∞∑i=1xcii
太棒了!居然找到了一个神奇的形式!
去重后直接枚举倍数求出 lnn∏i=111−xVi,根据调和级数,复杂度是 O(mlogm) 的。
然后一遍 exp 过掉。
代码:
1 |
|