首先考虑一个显然重要的子问题:
假定已有 ki 条定向的长为 i 的链 (1≤i≤n),将其任意连接为若干环,求环大小的乘积的和。
事实上我在场上使用多元拉格朗日反演得出了结论,不过在此不表。
考虑一个经典的组合意义:转化为从每个环中选出一个元素的方案数。
枚举 ci 表示长度为 i 的链被选择多少次,则其同时被钦定不在同一环内(这个方案数可以直接通过简单的组合意义得到): ∑0≤ci≤ki(n∏j=1(kjcj)jcj)(∑jkj−1)!(∑jcj−1)!
也就是 (n∑j=1kj−1)!∑i≥11(i−1)![xi]n∏j=1(1+jx)kj
我们把其放到容斥中,那么看起来我们务必要再用一元计量 ∑jkj。
也就是从环上每断出长 l 的链会贡献 (−1)l−1t(1+lx)。为了快速计算,我们再用一元 u 计量环长。当然这里是当做链来处理了,之后每一项要乘环长再除以链数(也就是 t 的次数)。
注意到 ∑l≥0(−1)l−1t(1+lx)ul=tu1+u+xtu(1+u)2=tu(1+x+u)(1+u)2
拼成链 11−tu(1+x+u)(1+u)2
其任意一项系数是容易提取的(可以按照 t,x,u 的顺序提取),于是分治并做二维卷积计算系数即可。
为了偷懒我直接写了映射到一维来实现二维的卷积,不过这样会有个问题就是卷积长度达到了 222,板子里的某个优化就用不了了(不过 DIT DIF 当然还是能写的)。
所以大概常数大了点。
代码:
1 |
|