【题解】[AGC005D] ~K Perm Counting
题意
如果一个排列 P P P 满足对于所有的 i i i 都有 ∣ P i − i ∣ ≠ k |P_i-i|\neq k ∣Pi−i∣=k ,则称排列 P P P 是合法的。求有多少种合法的排列。
Solution:
本题的限制条件很像错排,但是区别在于并不是一一对应的。
考虑容斥。问题转化成了求满足其中 K K K 个条件的排列数。
考虑这样一个序列:1 1+k 1+2k ... 1+mk
。在二分图中是这样的:
考虑其中一条链。为了使结构统一,我们把原始排列拆分成
2
n
2n
2n 个点,这样做的好处是将题意限制转化成了 不能选择两条相邻的边 。(这样点和边形成了映射关系)。
设
d
p
[
i
]
[
j
]
[
0
/
1
]
dp[i][j][0/1]
dp[i][j][0/1] 表示处理到前
i
i
i 个点,其中满足
j
j
j 个条件,i->i-1
是否连边。状态转移方程为:
- d p [ i ] [ j ] [ 0 ] = d p [ i − 1 ] [ j ] [ 0 ] + d p [ i − 1 ] [ j ] [ 1 ] dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1] dp[i][j][0]=dp[i−1][j][0]+dp[i−1][j][1]
- d p [ i ] [ j ] [ 1 ] = d p [ i − 1 ] [ j − 1 ] [ 0 ] ( j > = 1 ) dp[i][j][1]=dp[i-1][j-1][0](j>=1) dp[i][j][1]=dp[i−1][j−1][0](j>=1)
当然可以用 背包
将 2k
条链合并。我们可以把 2k
条链合并在一起进行
d
p
dp
dp ,对于链首的情况要特殊讨论。
时间复杂度 O ( n 2 ) O(n^2) O(n2) 。
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17530296.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」