ABC134F Permutation Oddness
[ABC134F] Permutation Oddness
好题,牛牛的一个套路 ——
写起来简单,想起来难的一个东西,难点主要是在 状态设置 上
我们可以把
我们考虑设置
分别表示 当前考虑了前
显然最终答案就是
这里可以发现,当前没有匹配上 其实就是 最终匹配上的点不是前
对点
我们顺序枚举三个状态,当每次 一个新点加入考虑(++i
)时,容易发现以下 三种情况
注意,下面 第三维 表示 怪异度 的值
均 没有实际意义,且 不代表同一个变量 可以理解成 占位符,关于 怪异度 的部分最后会讨论
-
新的点中 一对都都没匹配上
显然 此时 没匹配上的对数
多了一个(新增一对,没有匹配)于是我们需要从
处转移我们当前只考虑前
对点,也就是将 当前没匹配上(实际匹配 )的均看作 一种情况故 两者都没匹配上 的可能 只有一种,这里的贡献应当是
-
新的点中 匹配上了一对
显然 此时 没匹配上的对数
不变(新增一对,匹配一对),我们从 处转移而 匹配的这一对 有可能是 左部点
匹配到一个 中未被匹配的右部点,共 个也可能是 右部点
匹配到一个 中未被匹配的左部点,共 个还可能是 这一对点
互相匹配,显然一共三种情况,有 种可能匹配于是这里的贡献应当是
-
新的点中 匹配上了两对
显然 此时 没匹配上的对数
少了一个(新增一对,匹配两对),我们从 处转移显然
可以找 中 未被匹配的点,共 个同时
可以找 中 未被匹配的点,共 个当时想为什么这里是
而不是 ,挺唐诗的我们是从 前
对点,还剩 对未匹配的 处转移过来的当然有
种选择,而 只是表示 当前情况,与 能选择的种数无关容易知道,
与 的选择 互不干扰,于是最终将产生 种 可能匹配于是这里的贡献应当是
加在一起,最终的式子就是
这时我们来考虑一直忽略的 怪异度 这一维,这里提供一种和 现行题解 不完全相同的理解方式
前面部分参考题解,我们给对 对应点
那么 怪异度 就是 完美匹配 中 跨过连线 的 条数,这里可以参考 Tan_Wei_Ye 的 这篇题解
我们一直只考虑 前
只当枚举到
换言之就是
也就是有这
这时就可以 准确地描述 上面的转移了,我们每次一定增加
根据我们对 怪异度 的理解可以发现,上面的分类讨论 与 此处怪异度的贡献 并无关系
故 不用担心 上面分类讨论时 忽略怪异度 而对正确性造成影响
枚举并转移即可,具体见代码
由于我们 怪异度 在转移过程中 不会减少(不会有
需要用到 ) 故我们第三维转移只需要 终止在 需求的
即可,不需要转移到 理论怪异度上界
#include <bits/stdc++.h>
const int MAXN = 55;
const int MOD = 1000000007;
using namespace std;
int F[MAXN][MAXN][MAXN * MAXN];
int N, K;
int main () {
cin >> N >> K, F[0][0][0] = 1;
for (int i = 1; i <= N; ++ i)
for (int j = 0; j <= i; ++ j)
for (int k = j * 2; k <= K; ++ k)
F[i][j][k] = (1ll * ((j << 1) + 1) * F[i - 1][j][k - (j << 1)] + 1ll * (j + 1) * (j + 1) * F[i - 1][j + 1][k - (j << 1)] + (j > 0) * F[i - 1][j - 1][k - (j << 1)]) % MOD;
cout << F[N][0][K] << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具