时隔大约一年回来再做一遍。
看到自己当初用的是二项式反演,然后 ODE 的解法看起来非常构造(大概只是我不熟悉)。
气抖冷,难道平凡推导就推不出来吗!(也有可能我没搜到相关的)
推得出来的都不平凡。
前排提醒:如果没写明取值范围则默认取所有有意义的值。
先用集合幂级数或者 EGF 推,得到:
以下记 (l = n - 2m),并假设 (lin[0, D))(当 (l < 0) 或 (l geq D) 时是平凡的)。
注意到求和式中最硬的其实是 ((D - 2i - 2j)^n),因为 (n) 非常大,只能将其看成一个整体而不能展开。
因此以下再记 (s = i + j),则 (j = s - i)。原式化简成(省略 (frac{1}{2^D}) 的系数):
注意到后面的组合数可以消成 (frac{D!}{i!(k-i)!(s-i)!(D-k-s+i)!})。其中 (k) 只出现在两项中,因此可以变成:
这里有 (sum_{k=0}^{l} (-1)^{k-i}inom{s}{k-i} = (-1)^{l-i}inom{s - 1}{l-i})。
原因是 (sum(-1)^{k-i}inom{s}{k-i}x^{k-i} = (1 - x)^s),求前缀和等价于乘以因子 (frac{1}{1 - x}),得到 ((1 - x)^{s - 1})。
当然如果你乐意,可以用上指标反转 + 平行求和来证。只是要注意 edge case。
为了方便,我们特判 (s = 0) 的情况,得到:
这样只能得到 “对于所有 (s),求 ([x^l](1-x)^{s-1}(1+x)^{D-s})” 之类的结果,不太好做。考虑再消组合数:
就变成了求 “对于所有 (s),求 ([x^{s-1}](1-x)^l(1+x)^{D-l-1})”,至少可以 fft 了。
考虑 (F = (1 - x)^l(1 + x)^{D - l - 1}) 可否用 ODE 来递推。发现 (F' = (-l) imesfrac{F}{1-x} + (D - l - 1)frac{F}{1+x})。
瓶颈卡在求 ((D - 2s)^n),可以线性筛做到 (O(frac{D}{ln D} imes log n) = O(log_D n))。
你怎么写得还没 fft 快,丢人.jpg。
如果想知道更简单的推导方法,可以参考 https://codeforces.com/blog/entry/76447 中的最后一个。
难道用二项式反演就不能 ODE 递推吗!气抖冷!
貌似是可以的,注意到这里的二项式反演实际上就是复合 (F(x - 1)),复合之前 d-finite,复合之后自然也 d-finite。
没认真推过,推不出来别找我(