LOJ #3397. 「2020-2021 集训队作业」春天,在积雪下结一成形,抽枝发芽
设 n 个点这样的排列个数为 fn,设 n 个点的合点个数为 an,设 n 个点的析点个数为 bn,Cn=n!。
考虑如何求出 A:仅考虑儿子序列是上升的情况。条件转化为存在一个前缀满足是 [1,k](1<k<n) 的排列。考虑计算不满足的情况,设为 I。
I=C−CI
I=C1+C
所以 A=2C21+C,B=C−C21+C。
F(C)=C−C21+C−x
令 F=x−x21+x−F。
发现 F(C)=x。于是 F 和 C 互为复合逆,因此 C(F)=x。
C=x+xC+x2C′
x=F+Fx+F2C′(F)
x=F+Fx+F2F′
xF′=FF′+FF′x+F2
nfn=n−1∑i=1(i+1)fifn−i+n∑i=1ififn−i+1
fn=−n−1∑i=1(i+1)fifn−i−n−1∑i=2ififn−i+1
分治 FFT 即可。时间复杂度 Θ(nlog2n) 或 Θ(nlog2nloglogn)。
由于我懒,就写了 Θ(n2) 的。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 敏捷开发:如何高效开每日站会
· 为什么 .NET8线程池 容易引发线程饥饿
· golang自带的死锁检测并非银弹
· 如何做好软件架构师
· 记录一次线上服务OOM排查
· 场景题:假设有40亿QQ号,但只有1G内存,如何实现去重?
· 在 .NET 中使用 Tesseract 识别图片文字
· 欧阳的2024年终总结,迷茫,重生与失业
· Bolt.new 30秒做了一个网站,还能自动部署,难道要吊打 Cursor?
· 敏捷开发:如何高效开每日站会(Daily Stand-up Meeting)