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

link

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

考虑生成函数

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

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

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

\(B(x)=\sum_{i\ge 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的个数的。。。只是当时把这题扔到了一套题里面,三道题的输入输出都是一个数,懒得改数据了。。。)

posted @ 2019-03-26 18:36  ghj1222  阅读(453)  评论(0编辑  收藏  举报