猜排列 题解

推荐在 cnblogs 上阅读

猜排列 题解

差 eps 步想到正解。

题意描述

m m m 个长为 n n n 序列 a 1 , … , a n a_1,\dots,a_n a1,,an,还有 m m m 个长为 n n n 序列 b 1 , … , b n b_1,\dots,b_n b1,,bn

其中 b i b_i bi 是由 a i a_i ai 通过排列 p p p 置换得到的, b p i = a i b_{p_i}=a_i bpi=ai

现在又要求出排列 p p p 会有多种可能,模 998244353 998244353 998244353

Solution

首先手玩样例,发现如果这 m m m a a a 的某个位置和 b b b 的某个位置都是相等的,可以确保一定有一种可能的 p p p 排列使他们就是通过置换得到的。

有点像二分图,连个边再说。

发现有些位置是可以同时连不同的位置的(那当然了,不然答案就是唯一的,输出 1 1 1 就好了),这时发现,对面也可以向我们连边。而无论哪个样例,似乎连出来的二分图都是一个部的每个点都连向了另一个部的每个点。

那这个子图贡献的就是子图所有点 ÷ 2 \div 2 ÷2 的数量的阶乘。(就全排列嘛,除以二是因为二分图上下两部的点的数量是对称的)

考场就想到这里,发现如果要找子图的话是 O ( n 2 m ) O(n^2m) O(n2m) 的。含泪 80pts。

差那一步呢?

我们发现,同一位上的 m m m 次可以压成哈希。这样的话如果本来就是同一子图,那哈希值相等。

也不用建图了,因为可用 map 统计点数,不需要把图真正建出来去跑。

#include <bits/stdc++.h>
using namespace std;#define int long longconst int N = 6e5 + 5, P = 998244353, base = 19491001, P0 = 20090327, P1 = 20070923;int T, n, m;
int fac[N], inv[N], cnt[N];
bool vis[N];
unsigned int a[N][2], b[N][2];
int su, en[N], lt[N], hd[N];
map<pair<unsigned int, unsigned int>, unsigned int> mp1, mp2;
map<pair<unsigned int, unsigned int>, bool> Vis;void add(int u, int v) { en[++su] = v, lt[su] = hd[u], hd[u] = su; }void init() {fac[0] = 1;for (int i = 1; i <= N - 5; i++) fac[i] = fac[i - 1] * i % P;
}inline void solve() {memset(a, 0, sizeof a);memset(b, 0, sizeof b);scanf("%lld%lld", &n, &m);for (int i = 1; i <= m; i++) {int x;for (int j = 1; j <= n; j++) {scanf("%lld", &x);a[j][0] = (1ll * a[j][0] * base + x) % P0;a[j][1] = (1ll * a[j][1] * base + x) % P1;}for (int j = 1; j <= n; j++) {scanf("%lld", &x);b[j][0] = (1ll * b[j][0] * base + x) % P0;b[j][1] = (1ll * b[j][1] * base + x) % P1;}}mp1.clear(), mp2.clear();Vis.clear();for (int i = 1; i <= n; i++) mp1[{ a[i][0], a[i][1] }]++, mp2[{ b[i][0], b[i][1] }]++;int ans = 1;for (int i = 1; i <= n; i++) {if (!Vis[{ a[i][0], a[i][1] }]) {Vis[{ a[i][0], a[i][1] }] = 1;if (mp1[{ a[i][0], a[i][1] }] != mp2[{ a[i][0], a[i][1] }])ans = 0;elseans = ans * fac[mp1[{ a[i][0], a[i][1] }]] % P;}}printf("%lld\n", ans);
}signed main() {// freopen("interact.in","r",stdin);// freopen("interact.out","w",stdout);scanf("%lld", &T);init();while (T--) solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/24966.shtml

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

相关文章

ipc-test.bk and mmap is also similar.

1.config tab-4 vi /etc/virc或者 1.配置文件中如果要添加注释&#xff0c;不能用#&#xff0c;要使用” 2.u命令回退上次的操作 3.复制不带行号&#xff0c;在/etc/virc的末尾添加se mousea " add tab spaceset ts4 "只设置这个就能把tab缩进为4&#xff0c;加上…

Ubuntu24.04基本配置

目录 0. 前言1. 连接网络2. 更新源3. 安装并配置vim4. 设置用户sudo免密5. 同步双系统时间6. 设置终端颜色主题7. 设置中文输入法8. 调整Dock位置等9. 设置Grub10. 其它美化设置10.1 夜灯10.2 壁纸10.3 终端加强gnome-tweaks10.4 字体 11. 常用工具11.1 邮箱配置11.2 翻译工具1…

如何微调 Llama 3 进行序列分类?

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

图像滤波算法 python

1. 平均滤波 (Mean Filtering) 平均滤波是一种简单的线性滤波方法&#xff0c;通过取邻域内像素的平均值来平滑图像&#xff0c;从而去除噪声。 import cv2 import numpy as np# 读取图像 image cv2.imread(image.jpg)# 应用平均滤波 mean_filtered cv2.blur(image, (5, 5)…

极域卸载不干净导致无法重新安装问题:独家解决方案

文章目录 一、问题二、解决1.网上常规方法2.本贴特殊之处 三、致谢 一、问题 极域卸载不干净&#xff0c;导致无法重新安装。 二、解决 1.网上常规方法 1.regedit命令注册表删除 topdomain、mythware、{5FB4EEDF-6A79-45C3-B049-EF327CA03FCD} 2.删除极域对应tmp文件 网上…

迫在眉睫的革命:通用人工智能(AGI)与超级智能的竞赛

技术领域正处于一场将重新定义人类能力和理解边界的革命边缘。随着我们站在这一新时代的十字路口,开发通用人工智能(AGI)及其随后向超级智能的飞跃,不仅仅是一项科学努力,而是我们历史上的一个关键时刻。在这篇博客文章中,我们将深入探讨Leopold Aschenbrenner的文件《态…

Go微服务: 分布式之通过可靠消息实现最终一致性

通过可靠消息实现最终一致性 可靠消息&#xff0c;就是靠普消息&#xff0c;还是基于之前的这个案例 比如这个订单服务&#xff0c;无论你是先发送消息&#xff0c;还是先新建订单&#xff0c;它其实都是发送的不可靠消息就是说如果这个消息&#xff0c;像mysql事务那样&#…

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第七周) - 结构化预测

结构化预测 0. 写在大模型前面的话1. 词法分析 1.1. 分词1.2. 词性标注 2.2. 句法分析 2.3. 成分句法分析2.3. 依存句法分析 3. 序列标注 3.1. 使用分类器进行标注 4. 语义分析 0. 写在大模型前面的话 在介绍大语言模型之前&#xff0c;先把自然语言处理中遗漏的结构化预测补…

【机器学习】机器学习与医疗健康在智能诊疗中的融合应用与性能优化新探索

文章目录 引言机器学习与医疗健康的基本概念机器学习概述监督学习无监督学习强化学习 医疗健康概述疾病预测诊断辅助个性化治疗方案制定 机器学习与医疗健康的融合应用实时健康监测数据预处理特征工程 疾病预测与优化模型训练模型评估 诊断辅助与优化深度学习应用 个性化治疗方…

如何使用 Magisk 获取 Google Pixel 4 或 Pixel 4 XL 的 Root 权限

How to root the Google Pixel 4 or Pixel 4 XL with Magisk How to root the Google Pixel 4 or Pixel 4 XL with Magisk 给国内新用户的 Google Pixel 使用指南 - 少数派 12.0.0 (SP1A.211105.002, Nov 2021) https://developers.google.com/android/images#flame 小米…

接口自动化Requests+Pytest基础实现

目录 1. 数据库以及数据库操作1.1 概念1.2 分类1.3 作用 2 python操作数据库的相关实现2.1 背景2.2 相关实现 3. pymysql基础3.1 整个流程3.2 案例3.3 Pymysql工具类封装 4 事务4.1 案例4.2 事务概念4.3 事务特征 5. requests库5.1 概念5.2 角色定位5.3 安装5.4 校验5.5 reques…

C语言学习笔记 库文件

文章目录 概述生成静态库及应用生成动态库及应用 概述 在C语言中&#xff0c;库分为静态库(.a)和动态库(.dll或.so)。 调用静态库时&#xff0c;编译器会把库文件编译到可执行文件(.exe)里&#xff1b; 调用动态库时&#xff0c;编译器不会把库文件编译到可执行文件(.exe)里&a…

“中新美”三重身份,能帮SHEIN解决上市问题吗?

一家公司的海外上市之路能有多复杂&#xff1f;辗转多地的SHEIN&#xff0c;可能是当前最有话语权回答这个问题的公司。最近&#xff0c;它又有了新消息。 在上市信息多次更改后&#xff0c;伦敦正在成为SHEIN最有可能的“着陆”点。巴伦周刊援引英国天空新闻报道称&#xff0…

Python01 -分解整包数据到各个变量操作和生成器

Python 的星号表达式可以用来解决这个问题。比如&#xff0c;你在学习一门课程&#xff0c;在学期末的时候&#xff0c;你想统计下家庭作业的平均成绩&#xff0c;但是排除掉第一个和最后一个分数。如果只有四个分数&#xff0c;你可能就直接去简单的手动赋值&#xff0c;但如果…

5、搭建前端项目

5.1 使用vite vue搭建 win r 打开终端 切换到你想要搭建的盘 npm init vitelatest跟着以下步骤取名即可 cd fullStackBlognpm installnpm run dev默认在 http://localhost:5173/ 下启动了 5.2 用vscode打开项目并安装需要的插件 1、删除多余的 HelloWorld.vue 文件 2、安装…

【Vue3】理解toRef() 和 toRefs()

历史小剧场 知道可能面对的困难和痛苦&#xff0c;在死亡的恐惧中不断挣扎&#xff0c;却仍然能战胜自己&#xff0c;选择这条道路&#xff0c;这才是真正的勇气。----《明朝那些事儿》 前言 toRef 和 toRefs 是Vue3中的响应式转换工具函数 toRef: 不影响源对象的情况下&#x…

【数据结构】AVLTree实现详解

目录 一.什么是AVLTree 二.AVLTree的实现 1.树结点的定义 2.类的定义 3.插入结点 ①按二叉搜索树规则插入结点 ②更新平衡因子 更新平衡因子情况分析 ③判断是否要旋转 左单旋 右单旋 左右单旋 右左双旋 4.删除、查找和修改函数 查找结点 三.测试 1.判断是否是搜索树 …

java SpringData JPA中getOne and findById区别

在Spring Data JPA中&#xff0c;getOne和findById方法都用于根据ID获取实体&#xff0c;但它们的行为有所不同&#xff1a; 1、findById(ID id) Optional<User> optionalUser userRepository.findById(userId);if (optionalUser.isPresent()) {User user optio…

面试题-Vue2和Vue3的区别

文章目录 1. 响应式系统2. 组合式 API (Composition API)3. Fragment (碎片)4. Teleport (传送门) 5. 性能改进6. 移除或改变的功能7. 构建工具8. TypeScript 支持 Vue 2 和 Vue 3 之间存在许多重要的区别&#xff0c;这些区别涵盖了性能、API 设计、组合式 API&#xff08;Com…

AndroidStudio无法识别连接夜神模拟器

方法一(无法从根本上解决) ①进入夜神模拟器安装路径下的bin路径(安装路径可以带有中文路径) ②打开cmd窗口,输入以下代码(一定要打开模拟器) nox_adb.exe connect 127.0.0.1:62001 方法二(根本上解决) 原因:Android Studio的adb版本与夜神模拟器的adb版本不一致 ①打开And…