link。
时隔大约一年回来再做一遍。
看到自己当初用的是二项式反演,然后 ODE 的解法看起来非常构造(大概只是我不熟悉)。
气抖冷,难道平凡推导就推不出来吗!(也有可能我没搜到相关的)
推得出来的都不平凡。
前排提醒:如果没写明取值范围则默认取所有有意义的值。
先用集合幂级数或者 EGF 推,得到:
12Dn−2m∑k=0k∑i=0D−k∑j=0(−1)i(ki)(D−kj)(Dk)(D−2i−2j)n
以下记 l=n−2m,并假设 l∈[0,D)(当 l<0 或 l≥D 时是平凡的)。
注意到求和式中最硬的其实是 (D−2i−2j)n,因为 n 非常大,只能将其看成一个整体而不能展开。
因此以下再记 s=i+j,则 j=s−i。原式化简成(省略 12D 的系数):
∑s(D−2s)n∑il∑k=0(−1)i(ki)(D−ks−i)(Dk)
注意到后面的组合数可以消成 D!i!(k−i)!(s−i)!(D−k−s+i)!。其中 k 只出现在两项中,因此可以变成:
∑s(D−2s)n(Ds)∑il∑k=0(−1)i(si)(D−sk−i)=∑s(D−2s)n(Ds)∑il∑k=0(−1)k−i(sk−i)(D−si)
这里有 ∑lk=0(−1)k−i(sk−i)=(−1)l−i(s−1l−i)。
原因是 ∑(−1)k−i(sk−i)xk−i=(1−x)s,求前缀和等价于乘以因子 11−x,得到 (1−x)s−1。
当然如果你乐意,可以用上指标反转 + 平行求和来证。只是要注意 edge case。
为了方便,我们特判 s=0 的情况,得到:
∑s>0(D−2s)n(Ds)∑i(−1)l−i(s−1l−i)(D−si)
这样只能得到 “对于所有 s,求 [xl](1−x)s−1(1+x)D−s” 之类的结果,不太好做。考虑再消组合数:
∑s>0D−ls(D−2s)n(Dl)∑i(−1)l−i(ll−i)(D−l−1s−1−l+i)
就变成了求 “对于所有 s,求 [xs−1](1−x)l(1+x)D−l−1”,至少可以 fft 了。
考虑 F=(1−x)l(1+x)D−l−1 可否用 ODE 来递推。发现 F′=(−l)×F1−x+(D−l−1)F1+x。
瓶颈卡在求 (D−2s)n,可以线性筛做到 O(DlnD×logn)=O(logDn)。
你怎么写得还没 fft 快,丢人.jpg。
如果想知道更简单的推导方法,可以参考 https://codeforces.com/blog/entry/76447 中的最后一个。
难道用二项式反演就不能 ODE 递推吗!气抖冷!
貌似是可以的,注意到这里的二项式反演实际上就是复合 F(x−1),复合之前 d-finite,复合之后自然也 d-finite。
没认真推过,推不出来别找我(
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2020-03-17 @bzoj - 4671@ 异或图