有一个简单的 O(n3) DP,考虑 fx+1,k=∑xj=0fx,k−j,利用前缀和优化即可。
考虑这实际上是 fx+1(k)=fx(k)∗1−kx+11−k,于是答案实际上为:
[xk]f(x)=n∏i=11−xi1−x
接下来的方法来自 EI
,大力膜拜,这里稍稍细致展开。
考虑加入哑元 t,也就是看似没有用的一个元:
f(t)=n∏i=11−xit1−x
有一个重要的观察是:
f(xt)=n∏i=11−xi+1t1−x=f(t)1−xn+1t1−xt
因此有 (1−xt)f(xt)=(1−xn+1t)f(t)。
有一个关键的等式:
[tm]f(xt)=xm[tm]f(t)
考虑 [tm]f(t) 是由某 k 个 xit 选来,现在每一个 t 都多来了一个 x,那么自然就多了 m 个 x,于是得到了上式。
考虑设 fm=[tm]f(x),也就是此时将 f 看作一个关于 t 的多项式,而系数 fm 实际上一个关于 x 的多项式。
我们在 (1−xt)f(xt)=(1−xn+1t)f(t) 对两边同时取 [tm],可以得到:
[tm]f(xt)−[tm]xtf(xt)=[tm]f(t)−[tm]xn+1tf(t)xmfm−x×xm−1fm−1=fm−xn+1fm−1(xm−1)fm=(xn+1−xm)fm−1fm=−xm1−xn−m+11−xmfm−1
现在我们考虑如何维护这个函数。
考虑 11−xm=∑kxkm,实际上是对于 fm−1 做一个间隔为 m 的前缀和。
考虑 1−xn−m+1 就是 fm(x)←fm(x)−fm(x−(n−m+1) 即可。
于是考虑 gm=1−xn−m+11−xmgm−1,那么
fm=(−1)mxm×(m+1)2gm
g 是好维护的,最终答案为 ∑[xk]fm=∑[xk−m(m+1)2](−1)mgm,发现当 m>√k 的时候就没有值了,所以只需要维护 O(√k) 次卷积,每次是 O(k) 的,非常优秀。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
2023-01-15 算法学习笔记(9): 中国剩余定理(CRT)以及其扩展(EXCRT)