「loj - 2554」青蕈领主

link。


首先如果 Lnn 则无解,以下默认 Ln=n


li=iLi+1,即最长连续段的左端点。

由一些基本常识,连续段的交、并、差仍是连续段;这可以推出所有 [li,i] 互相包含或相离(如果不满足,则无解)。

建出树形结构:根为 [1,n];对于 [li,i],如果 li=i 则它为叶子;否则它的儿子为 [li1,i1];[lli11,li11];

不难发现 [li,i] 子树内怎么定方案与外部无关,那么只需要考虑每个点的所有儿子如何分配方案,将所有点的贡献相乘即可。

也即,如果记 fi 表示有 i 个儿子的方案数,记 degi 表示 i 的儿子个数,则答案为 i=1nfdegi


然后我们进入 counting 环节。

先考虑 fn 的一个等价定义:长度为 n+1 的排列,其中 L1n=1,Ln+1=n+1 的方案数。

比较难看出 {fn} 可能具有的递归结构,那么正难则反。

总方案数为 (n+1)!,其中不合法当且仅当根 [1,n+1]的儿子个数 <n

注意我们只考虑了根,根以下的子树没有加以任何限制,所以贡献为子树大小的阶乘。

因此,如果记 G(x)=n>0n!xn,则有 fn=(n+1)!i=1n1fi[xn]Gi(x)


以下依然记 G(x)=n>0n!xn

事实上,如果记 F(x)=n0fnxn,则有一个组合意义更明显的式子:

F(G(x))=n0(n+1)!xn

即依据根的儿子个数,将所有 (n+1)! 种排列分类。

将右边也化成 G(x) 的形式,得到:xF(G(x))=G(x)

如果记 H(x)G(x) 的复合逆,则:F(x)=x/H(x)

太好了,套用复合逆算法卡卡常说不定就过了。


注意到 G 是经典的微分有限。事实上,根据 gn=ngn1+[n=1],有 G=x2G+xG+x

x 代换成 H(x)

G(x)=x2dG(x)dx+xG(x)+xx=H2dG(H)dH+Hx+Hx=H2dxdH+Hx+Hx=(x/F)2(1(x/F))+(x/F)x+(x/F)0=F2xFF2xF+x2F+xFF

我承认,最后一步跳得有点快。

取第 n 项,得到 0=i=0nfifnii=0ni×fifni2fn1+(n1)fn1+nfnfn

那么有递推式 fn=i=1n1(i1)×fifni(n3)fn1

或者说 fn=i=2n2(i1)×fifni+(n1)fn1

条件 f0=1

之后再做个分治 fft 即可,复杂度 O(nlog2n)


另一种推导方法:https://blog.csdn.net/qq_39972971/article/details/89408417

最后依然是求助环节:有没有懂哥愿意教教我 simple permutations 咋数啊。

posted @   Tiw_Air_OAO  阅读(223)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2020-05-13 @atcoder - ARC077F@ SS
点击右上角即可分享
微信分享提示