题解:AT_abc214_g [ABC214G] Three Permutations

news/2025/9/28 13:56:44/文章来源:https://www.cnblogs.com/LUlululu1616/p/19116517

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

做法:

直接做很困难,考虑容斥,钦定若干个 \(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.mzph.cn/news/920705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过velocity将增量发版的代码及文件生成生成一个linux shell文件(解放运维)

pom.xm <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId></dependency> resource/shell/release_cp.sh.vm发版失败回…

从企业级项目到普惠API:我如何将自研的人脸识别引擎打造成「识度AI」

我把做过的人脸识别项目,变成了一个赚钱的副业:识度AI的从0到1实战录 ​ 嘿,朋友们,我是菠菜啊,一个标准的Java后端开发者,日常与SpringBoot和MySQL打交道。和你们一样,我不仅对技术实现着迷,更对如何让技术产…

得帆AI aPaaS 1.0正式发布,低代码+AI关键特性等你探索

自2022年起,得帆开始了对AI战略的持续探索与研究,致力于开发AI相关的产品及其特性。2025年5月15日,在上海中心J酒店举行的得帆AI战略发布会上,得帆正式公布了最新的AI产品演进路线图和Roadmap。 在此次战略发布会上…

【Array】数组:多个值的集合

【Array】数组:多个值的集合在编程中,我们经常需要处理一组相关的数据。数组(Array) 就是用来存储多个值的容器,它让我们能够将相关的数据项组织在一起,进行批量操作和处理。 一、 什么是数组? 数组就像一个多格…

Go基础:文件与文件夹操控详解

Go基础:文件与文件夹操控详解2025-09-28 13:41 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importan…

【代码注释】给脚本加上说明

【代码注释】给脚本加上说明在开始学习变量和编程概念之前,我们先要掌握一个简单但极其重要的技巧——代码注释。注释就像是给代码加的"便签"或"说明书",它们不会影响程序的运行,但能让代码更容…

百度站长工具链接提交怎么运营自己的网站

所谓的大道至简就是说大道理&#xff08;基本原理&#xff0c;方法和规律&#xff09;是极其简单的&#xff0c;简单到一两句话就能说明白。所谓“真传一句话&#xff0c;假传万卷书”。这也许也是这本书只有一百多页的原因吧。 说实话&#xff0c;《大道至简》这部作品对现在有…

帮助向量机深度解析:从数学原理到工程实践的完整指南

帮助向量机深度解析:从数学原理到工程实践的完整指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

网站建设与研发公司建设网站策划书

目录 前言 国内外研究现状 自然场景文本检测任务面临的挑战 自然场景文本检测的研究现状

设计网站遇到的问题看片狂人

以下主要描述了&#xff1a; TFS源代码控制系统的基本场景如何把一个项目添加到源代码管理中如何与服务器同步如何做Check-In如何做分支与合并什么是上架与下架 我们知道工作项是项目管理的基本元素&#xff0c;但是一个项目的成功&#xff0c;光有工作项还是不够的。工作项说…

【Array】类型化数组:强类型集合的优势

【Array】类型化数组:强类型集合的优势在掌握了数组的基本操作后,我们需要深入理解类型化数组的概念。类型化数组为数组元素指定明确的数据类型,这在安全性、性能和代码可读性方面都有显著优势。 一、 什么是类型化…

2025节能报告咨询机构最新推荐榜单:帮项目方筛选高效节能方案服务机构

在全球可持续发展战略深入推进,国内各类项目对节能要求不断提高的当下,一份专业、精准的节能报告已成为项目顺利落地、实现长期效益的关键。然而,当前节能报告咨询机构数量众多,资质水平参差不齐,项目方在选择时往…

无锡网站制作高端织梦响应式网站模板

吴川华南区技术负责人概要很多用户反馈电脑经过使用一段时间后&#xff0c;在开机或运行的时候变得十分缓慢。本文将针对Win 10启动慢(Win 10开机慢)这一问题&#xff0c;来为大家分析其原因及解决方案。新买的电脑一般都运行顺畅&#xff0c;不过使用一段时间后&#xff0c;在…

网站建设 599网页制作免费的模板

1. 海塞矩阵 海塞矩阵是一个由多变量实值函数的所有二阶偏导数组成的方块矩阵。 一元函数就是二阶导,多元函数就是二阶偏导组成的矩阵。求向量函数最小值时可以使用,矩阵正定是最小值存在的充分条件。经济学中常常遇到求最优的问题,目标函数是多元非线性函数的极值问题,尚…

详细介绍:DBA | MySQL 数据库基础数据操作学习实践笔记

详细介绍:DBA | MySQL 数据库基础数据操作学习实践笔记2025-09-28 13:31 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; …

外卖网站开发能多少钱常见的网站结构类型

4.1 顺序结构 在任何编程语言中最常见的程序结构就是顺序结构。顺序结构就是程序从上到下一行行地执行&#xff0c;中间没有任何判断和跳转。 如果Python程序的多行代码之间没有任何流程控制&#xff0c;则程序总是从上往下依次执行&#xff0c;排在前面的代码先执行&#xf…

广州市公司网站建设品牌做电脑网站用什么软件有哪些方面

创建wilddog应用填写应用名称和应用ID就可以创建了。应用ID需要全网唯一创建成功之后就可以在控制面板看到应用了.1.引入SDK2.创建引用ref Wilddog("https://.wilddogio.com/")//将替换成申请的应用IDref Wilddog("https://fullstack-top-demo.wilddogio.com/…

Windows远程桌面出现CredSSP加密数据修正问题解决方案

问题现象: 解决方案:方案一:1、win+R打开运行窗口2、输入gpedit.msc命令,点击“确定”3、依次展开“计算机配置”->“管理模板”->“系统”->“凭据分配”设置名称: 加密数据库修正4、双击“加密数据库修…

河南微网站开发佛山网站推广经理

牙膏厂终于发布了入门级性价比最高的十代CPU&#xff0c;inte i3 10100F。10100F采用LGA1200芯片接口,四核八线程,主频3.6GHz&#xff0c;睿频可以到4.3Ghz。TDP功耗65w&#xff0c;支持双通道DDR4 2666内存。可以搭配H410或B460主板。首发价格为699元&#xff0c;性价比非常的…

【安装红帽子 redhat Linux 9.0版本】教程

【安装红帽子 redhat Linux 9.0版本】教程 https://www.bilibili.com/video/BV1354y1d7fP/?vd_source=ac9167e61e0c909658ec9e3b6350cd4e