loj6570 毛毛虫计数(生成函数FFT)

link

巨佬olinr的题解 <-- olinr很强

考虑生成函数

考虑直径上点数>=4的毛毛虫的直径,考虑直径中间那些节点以及他上面挂的那些点的EGF

(A(x)=sum_{ige 1}frac{ix^i}{i!})

考虑和直径两端点相连的节点,我们强制让他挂至少一个点(否则他就成了直径端点就重复了),EGF

(B(x)=sum_{ige 2}frac{ix^i}{i!})

最后答案生成函数就是

(Ans(x)=B(x)*frac{1}{1-A(x)}*B(x))

考虑直径上点数为3的毛毛虫,发现就是一个菊花,刚好有 n 种情况

另外毛毛虫正着反着是一样的,注意除以一个2

所以答案为 (frac{[x^n]Ans(x)n!}{2}+n)

另外n=2要特判,一开始就想到了,只是忘了造这种数据了,然后好多人没特判就加上n=2数据了卡同学23333

代码太丑不放了23333

关于这个idea是怎么来的,olinr讲了 [ZJOI2016]大森林 这道题,我大力debug没d出来,就把第一个样例放graph editor里大力跑,然后虚点连成了一个类似毛毛虫的东西...于是就有了这题... 所以题面里写的 olinr是巨佬

吐槽:为了验证解法,我手跑小数据时候发现n<=6所有树都是毛毛虫,n=7只有一种情况不是(中心一个点,身处3条长度为2的链) n=8只好枚举毛毛虫的形态再用高中数学那套理论跑。。。一开始跑错了,后来对了

upd:巨佬xyx用容斥A了。。。比生成函数FFT多项式求逆快好几倍。。。link

(其实我当初就应该直接要求输出1到n的个数的。。。只是当时把这题扔到了一套题里面,三道题的输入输出都是一个数,懒得改数据了。。。)

原文地址:https://www.cnblogs.com/oier/p/10602560.html