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

【康托展开】P5367 【模板】康托展开

康托展开

学习是一个持续的过程,每一小步都是进步。

———— 未知

1. 定义

康托展开是一种将全排列映射到唯一自然数的双射算法(即一一对应,无重复、无遗漏)。
简单来说,它能给每一个 n 位全排列分配一个独一无二的“序号”,这个序号代表该排列在所有按字典序排列的全排列中的位置。

康托展开的核心价值在于:

  • 实现全排列的空间压缩:将长度为 n 的排列(需要 n 个存储单元)转化为一个自然数(仅需 1 个存储单元)。
  • 可逆性:逆康托展开。

2. 原理与推导

2.1 核心思想

对于一个 n 位全排列 a[1...n],其康托展开值(即字典序排名)的计算逻辑是:
对排列的每一位 a[i],统计在它之后比它小的数字的个数,乘以 (n-i)!(剩余位数的阶乘),将所有位的结果累加后加 1(排名从 1 开始,而非 0)。

公式表示:

\[X = \sum_{i=1}^{n-1} (k_i \times (n-i)!) + 1 \]

其中 \(k_i\) 是第 i 位之后比 \(a[i]\) 小的数字个数。

2.2 推导

以排列 3 4 1 5 2(n=5)为例,分步计算其康托展开值:

位置 i 数字 a[i] 后面比 a[i] 小的数字 \(k_i\) 剩余位数 \((n-i)!\) 贡献值 \(k_i \times (n-i)!\)
1 3 2 4 24 \(2 \times 24 = 48\)
2 4 2 3 6 \(2 \times 6 = 12\)
3 1 {} 0 2 2 \(0 \times 2 = 0\)
4 5 1 1 1 \(1 \times 1 = 1\)
5 2 无后续数字 - 0 1 无需计算

累加所有贡献值:\(48 + 12 + 0 + 1 = 61\),加 1 后最终排名为 \(62\),即 3 4 1 5 2 是 5 位全排列中字典序第 62 个排列。

3. 代码实现与解析

#include<bits/stdc++.h>
using namespace std;// 预定义阶乘数组:factorial[k] 表示 k!,覆盖0!到10!(满足10位排列需求)
const int factorial[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800}; int cantor(int a[], int n) {int ans = 0, sum = 0; // ans存储累加结果,sum统计当前位后更小数字的个数// 遍历第1位到第n-1位(最后一位无后续数字,无需计算)for (int i = 1; i < n; i++) {// 统计第i位之后比a[i]小的数字数量for (int j = i + 1; j <= n; j++) {if (a[j] < a[i]) {sum++;}}// 累加当前位的贡献值:sum * (n-i)!ans += sum * factorial[n - i];sum = 0; // 重置计数器,准备统计下一位}return ans + 1; // 排名从1开始,因此加1
}int main() {int perm[12], len; // perm存储排列(最多支持10位),len:排列长度cin >> len;for (int i = 1; i <= len; i++) {cin >> perm[i];}cout << cantor(perm, len) << '\n';return 0;
}
http://www.jsqmd.com/news/290662/

相关文章:

  • 华设设计集团安卓开发岗位深度解析与技术指南(完整版)
  • 适合技术学习的5个科学学习技巧
  • 【2026最新】系统进程优化工具 | Process Lasso 中文绿色便携版,智能进程管理工具 使用与安装教学
  • 进程优化工具 Process Lasso v17.0.2.20 绿色便携版,Process Lasso调试进程级别的系统优化工具,CPU优化工具ProcessLasso
  • Veitool 后台框架系统 - ThinkPHP 版 v2.3.5 已经发布
  • 【最新版】系统进程优化工具Process Lasso v17.0.2.20 便携版 轻松搞定进程管理难题 !拯救老电脑告别卡顿
  • 【读书笔记】《主街百万富翁》
  • 【计算机毕业设计案例】基于springboot框架实现医疗服务系统管理平(程序+文档+讲解+定制)
  • MBA必看!9个降AI率工具高效推荐
  • 【计算机毕业设计案例】基于Spring Boot的线上教学平台基于springboot的在线教育平台(程序+文档+讲解+定制)
  • 学长亲荐!专科生毕业论文必备TOP8 AI论文平台测评
  • 260123A 供音树
  • Java计算机毕设之基于Java的在线教育平台基于Spring Boot+vue的线上教学平台(完整前后端代码+说明文档+LW,调试定制等)
  • 12306 购票辅助工具:余票监控提醒 + 候补自动提交(支持 Windows)
  • 人群仿真软件:SimWalk_(6).建筑环境建模
  • 人群仿真软件:SimWalk_(6).人群流特性及参数设置
  • 人群仿真软件:SimWalk_(7).动态仿真过程控制与监视
  • 人群仿真软件:SimWalk_(4).用户界面操作与基本功能介绍
  • RHCSA
  • Java毕设项目推荐-基于协同过滤算法的音乐推荐系统基于springboot的个性化音乐推荐系统【附源码+文档,调试定制服务】
  • Qt常用控件指南(2)
  • 奇技淫巧之花里胡哨的VIM---插件的添加与美化
  • Java毕设项目推荐-基于Vue/SpringBoot的社区智慧医疗服务管理系统【附源码+文档,调试定制服务】
  • 2026年小程序商城原来可以这样0代码搞定!
  • Java毕设项目推荐-基于SpringBoot+Vue的在线教育平台基于springboot的在线学习平台在线教育平台【附源码+文档,调试定制服务】
  • 人群仿真软件:Pathfinder_(14).行业应用与案例研究
  • 2024年提示工程架构师领域发展预测:挖掘行业潜力
  • Linux --- tar命令常见用法
  • 人群仿真软件:Pathfinder_(14).与其他软件的集成与互操作
  • CentOS7更换为阿里源