当前位置: 首页 > news >正文

题解:AT_abc214_g [ABC214G] Three Permutations

题意:很简单了,不再赘述。

做法:

直接做很困难,考虑容斥,钦定若干个 \(i=x_i\) 或者 \(i=y_i\),然后如果钦定了 \(k\) 个,那么贡献是 \((n-k)!(-1)^k\)

但是有个问题,我们不能无脑钦定,这些钦定条件间会有一些问题,比如我可能钦定 \(i=k\) 但是同时 \(j=k\),这样就爆炸了。

所以我们考虑对于不能同时钦定的限制去连一条边,手玩一下你会很惊奇地发现这样会形成若干个环,并且这个环上不能取相邻元素!

具体怎么连环呢,对于同一个 \(i\) 间的两个是不能同存的,然后两行同一个数不能被同时钦定。

那么我们就可以对不同长度的环进行 dp,计算出来这个环选 \(x\) 个的有多少种方案,直接枚举第一个选或不选然后跑 dp 即可,复杂度 \(O(n^2)\)

然后最后我们再用一次 dp 对所有的环统计出来钦定了 \(x\) 个限制的方案数,虽然是三重循环但是枚举第 \(x\) 个环再枚举环上选了多少个这两个是 \(O(n)\) 的。

最后乘上贡献即可,复杂度 \(O(n^2)\)

注意一个细节,对于 \(x_i = y_i\) 的情况限制可以同时存在,这种需要特判一下,环上选一个的方案数只有 \(1\) 种。

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 6005, mod = 1e9 + 7;
int f[maxn][maxn], t[2][maxn][2], use[maxn], dp[maxn][maxn], len[maxn], tot, jc[maxn];
int x[2][maxn], n;
void solve(int x) {memset(t, 0, sizeof(t));t[0][0][0] = 1;int cur = 0;for (int i = 2; i <= x; i++) {cur ^= 1;for (int j = 0; j <= (i + 1) / 2; j++)t[cur][j][0] = t[cur][j][1] = 0;for (int j = 0; j <= (i + 1) / 2; j++) {t[cur][j][0] = (t[cur ^ 1][j][0] + t[cur ^ 1][j][1]) % mod;t[cur][j][1] = t[cur ^ 1][j - 1][0];} }for (int i = 0; i <= x / 2; i++)f[x][i] = (t[cur][i][0] + t[cur][i][1]) % mod;memset(t, 0, sizeof(t));t[0][1][1] = 1;cur = 0;for (int i = 2; i <= x; i++) {cur ^= 1;for (int j = 0; j <= (i + 1) / 2; j++)t[cur][j][0] = t[cur][j][1] = 0;for (int j = 0; j <= (i + 1) / 2; j++) {t[cur][j][0] = (t[cur ^ 1][j][0] + t[cur ^ 1][j][1]) % mod;t[cur][j][1] = t[cur ^ 1][j - 1][0];} }for (int i = 0; i <= x / 2; i++)f[x][i] = (t[cur][i][0] + f[x][i]) % mod;
}
void solve() {for (int i = 1; i <= tot; i++)use[len[i]] = 1;for (int i = 1; i <= 2 * n; i++)if(use[i])solve(i);f[2][1] = 1;dp[0][0] = 1;int s = 0;for (int i = 1; i <= tot; i++) {s += len[i];for (int j = 0; j <= s / 2; j++)for (int k = 0; k <= min(len[i] / 2, j); k++)dp[i][j] = (dp[i][j] + dp[i - 1][j - k] * f[len[i]][k]) % mod;}int ans = 0;jc[0] = 1;for (int i = 1; i <= n; i++)jc[i] = jc[i - 1] * i % mod;for (int i = 0; i <= n; i++)ans = (ans + dp[tot][i] * jc[n - i] % mod * (i % 2 ? mod - 1 : 1) % mod) % mod;cout << ans << endl;
}
int pos[2][maxn], p[maxn], vis[maxn];
void dfs(int u, int d) {if(vis[u]) {len[tot] = d - vis[u];return ;}vis[u] = d;dfs(p[u], d + 1);
}
signed main() {cin >> n;for (int t = 0; t <= 1; t++) {for (int i = 1; i <= n; i++)cin >> x[t][i], pos[t][x[t][i]] = i;}for (int i = 1; i <= n; i++)p[i] = i + n, p[pos[1][x[0][i]] + n] = i;for (int i = 1; i <= 2 * n; i++)if(!vis[i]) tot++, dfs(i, 1);solve();return 0;
}
http://www.hskmm.com/?act=detail&tid=19938

相关文章:

  • 通过velocity将增量发版的代码及文件生成生成一个linux shell文件(解放运维)
  • 从企业级项目到普惠API:我如何将自研的人脸识别引擎打造成「识度AI」
  • 得帆AI aPaaS 1.0正式发布,低代码+AI关键特性等你探索
  • 配置驱动的动态 Agent 架构网络:实现高效编排、动态更新与智能治理
  • NVIDIA Dynamo深度解析:如何优雅地解决LLM推理中的KV缓存瓶颈 - 实践
  • 完整教程:二十一、DevOps:从零建设基于K8s的DevOps平台(二)
  • 心跳交换机故障导致节号与数据库实例号不一致
  • 悟空备案制在AI伦理治理中的应用研究:从理论架构到实践落地
  • 深入解析:《基于Qt的车载系统项目》
  • 2025节能报告咨询机构权威排行榜:节能报告审查,验收报告优选节能报告机构全解析
  • 2025节能报告咨询机构最新推荐榜单:帮项目方筛选高效节能方案服务机构
  • Windows远程桌面出现CredSSP加密数据修正问题解决方案
  • linux执行yum报错: except KeyboardInterrrupt, e
  • CentOS 10服务器版 部署Zabbix7.2 server端 - 教程
  • grafana如何添加自定义geoJson地图
  • 第一次算法分析作业
  • 2025 年过滤器品牌权威推荐排行榜:TOP5 企业技术实力测评,覆盖化工 / 环保 / 空气净化等多场景最新选型指南
  • AI元人文:追问与悟空
  • 2025 年软著申请一站式服务公司最新推荐排行榜:精选专业高效机构,解决企业个人申请难题
  • web3实战工程 - hardhat框架
  • 重组蛋白表达中包涵体的形成与优化策略
  • 【MySQL】性能优化与核心机制深度解析 - 详解
  • 程序员究竟要不要写文章
  • B4375 [蓝桥杯青少年组省赛 2025] 庆典队列B4376 [蓝桥杯青少年组省赛 2025] 茶具套装B4377 [蓝桥杯青少年组省赛 2025] 平衡奇偶位置的字符交换
  • 2025 年纽扣电池厂家:力源电池以 TWS 适配技术与定制服务,打造多场景电源解决方案
  • crewCTF 2025 -- WASM Vault
  • 神经网络常见的40多种激活函数(应用场景+数学公式+代码实现+函数图象)
  • oppo-r9m线刷刷机教程
  • AWS SageMaker SDK 完整教程:从零开始云端训练你的模型
  • 废品回收小程序:从 “扔垃圾“ 到 “变资源“ 的体验革命 - 详解