康托展开与逆康托展开(模板)

康托展开&逆康托展开 文章目录康托展开&逆康托展开1.算法分析1.1 康托展开1.2 逆康托展开2.模板3.典型例题 康托展开&逆康托展开 1.算法分析 康托展开可以求一个序列是第几个排列,即求得[2, 1, 3]是第3个排列 逆康托展开可以求得第k个排列是多少,即求得第3个排列为[2, 1, 3] 基于这个性质,可以使用康托展开把一个序列做哈希,映射为一个数字。 1.1 康托展开 康托展开公式:当前排列的的排名为: rank=an∗(n−1)!+an−1∗(n−2)!+...+a1∗0+1rank = a_n* 阅读详情

康托展开:

求一个数在全排列中的第几位。
例如{1,2,3,4,…,n}表示1,2,3,…,n的排列,12345……n,即为第0个排列。
以{1,2,3,4} 表示1,2,3,4的排列为例,求1324在全排列中的第几位。
由组合数学易得:全排列的总数为4!。
第一位有4种选法,第二位3种,第三位2种,第一位1种。
首先 1 比 它小的数是 0 个 ,比1000小的排列有0 * 3!(3!代表后面3个数的全排列个数)
其次 3 比 它小的数有1,2。但1已经在前面出现过了,所以比1300小的排列有 1*2!。
然后 2 比 它小的数有 1。 但1已经出现过了,所以比1320小的排列有
0*1!。
最后 4 比 它小的数有1,2,3,但都已经出现过了,所以没有比1324
0*3!+1*2!+0*1! = 2.
排在第二位
1234
1243
1324

完整的公式如下:

把一个整数X展开成如下形式:
X=a[n](n-1)!+a[n-1](n-2)!+…+a[i]*(i-1)!+…+a[2]*1!+a[1]*0![1]
其中a[i]为当前未出现的元素中是排在第几个(从0开始),并且0<=a[i]

逆康托展开:

既然可以求一个数在排列中的第几个,那么反过来也可以求在排列中第i个数是多少。

例如以 {1,2,3,4,5}的排列为例,求第96个数。
首先96-1 = 95(因为是从0开始计数)
95 / 4! = 3 余 23。 可知比它小的数有3个,即为 4.
23 / 3! = 3 余 5 。 可知比它小的数有 3 个, 因为4已经出现过,所以为5.
5 / 2! = 2 余 1 。 可知比它小的数有 2 个, 即为 3.
1 / 1! = 1 余 0 。可知只有 2 符合
1 / 0! = 0。 可知只有 1 符合。
最终结果 为45321。
注意:为什么除以4!就可以算出有几个数比它小呢?
因为: 3*4!+3*3!+2*2!+1*1!+0*0! = 95。

95 / 4! = 3 余 3*3!+2*2!+1*1!+0*0!
这里会有疑问,3*3!+2*2!+1*1!+0*0!难道不会大于等于4!吗?

不会的,这里简单的做个比较

(3!+2!+1!+0!)*x > 4 !
x > 2.4。

然而总共只有5个数,3!最多对应3,2!最多对应2,1的阶乘1,0的阶乘0(此处都不用考虑4的阶乘对应的值), (3+2+1+1) < 2.4*4
所以 3*3!+2*2!+1*1!+0*0!肯定 < 4!。
6位数7位数也是一样的,也都无法满足,具体证明可能需要用到数学归纳法(太博大精深,菜鸡不会QAQ)

具体模板:

//预处理阶乘值
int fac[20];
void factor(){
    fac[0] = fac[1] = 1;
    for(int i = 2; i < 13; ++i)
        fac[i] = fac[i-1]*i;
}
//逆康托
string uncantor(int x, int k) {
    string res;
    int i, j, l, t;
    bool h[100]={0};
    for (i = 1; i <= k; i++) 
    {
        t = x / fac[k - i];
        x -= t * fac[k - i];
        for (j = 1, l = 0; l <= t; j++)
            if (!h[j])
                l++;
        j--;
        h[j] = true;
        res += j + '0';
    }
    //康托
 int cantor(int* a,int len){

    int ans = 0;
    for(int i = 0; i < len; ++i){
        int t = 0;
        for(int j = i+1; j < len; ++j){
            if(a[j] < a[i]) t++;
        }
        //cout << t << endl;
        ans += fac[len-i-1]*t;
    }
    return ans+1;//第几个数
}
数据分析实战:如何用皮尔逊相关系数避免伪相关陷阱(附Python代码) 本文通过实战案例与Python代码,深入解析了皮尔逊相关系数在数据分析中的应用与常见陷阱。文章重点揭示了如何识别与避免由混杂变量导致的伪相关,并介绍了通过可视化、敏感性分析、分层分析与偏相关分析等方法来检验相关性的可靠性,帮助分析师建立严谨的相关性思维。 阅读详情

相关推荐

峰岹FU6832L双核电机控制芯片实战:从FOC算法到BLDC/PMSM驱动开发

在嵌入式系统和电机控制领域,磁场定向控制(FOC)是实现无刷直流电机(BLDC)和永磁同步电机(PMSM)高效、平稳运行的核心算法。其原理是通过坐标变换将三相交流量分解为直流量,实现类似直流电机的转矩与磁场解耦控制,从而提升效率、降低噪音与振动。这项技术的工程价值在于能以更低的处理器开销实现高性能驱动,广泛应用于消费电子、工业自动化与智能家电。本文以峰岹FU6832L芯片为例,深入解析其独特的双核架构——将实时性要求极高的FOC运算交由专用硬件引擎处理,解放主控CPU处理应用逻辑,并结合PID参数整定、电流

weixin_29570795的博客 508

【数论系列】 康托展开

康托展开是一个全排列到一个自然数的双射,常用于构建特定哈希表时的空间压缩。康托展开的实质是计算当前排列在所有由小到大全排列中的次序编号,因此是可逆的。即由全排列可得到其次序编号(康托展开),由次序编号可以得到对应的第几个全排列(逆康托展开)。康托展开的:其中:X 为比当前排列小的全排列个数(X+1即为当前排列的次序编号);n 表示全排列表达式的字符串长度;表示原排列表达式中的第 i 位(由右到左由低到高)在当前未出现(剩下未被选择)的元素集合中比其小的元素个数。

这里是阿安的博客 2960

手把手教你用CMake和MinGW64编译libuvc:静态链接与动态链接的选择

本文详细指导如何在Windows平台上使用CMake和MinGW64编译libuvc库,并深入探讨静态链接与动态链接的选择策略。通过对比两种链接方式在部署复杂度、内存占用和版本管理等方面的差异,帮助开发者根据项目需求做出最优决策,实现高效的USB摄像头开发。

weixin_29171087的博客 254

都能看懂的康托展开

康托展开简介: 官方简介: 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。 通俗简介: 康托展开可以求解一个排列的序号,比如:12345 序号为 1 ,12354序号为2,按字典序增加编号递增,依次类推。 康托逆展开可以求解一个序号它对应的排列是什么。 康托展开解释: 先给出康托展开的公...

ltrbless的博客 2万+

Flink on k8s 环境搭建(一)

Flink on Yarn的环境搭建过程中,需要进行配置较多,且需要搭建zookeeper Hadoop Yarn 等相关组件,安装流程比较复杂,集群出现问题重新安装的流程也比较复杂,且Yarn的3个节点中 只能起了 3个resourceManager和1个NodeManager,Flink 作业申请资源时只能 向NodeManager的节点申请资源,整体有资源瓶颈的隐患(后继flink作业会越来越多),现在尝试进行Flink on k8s 的环境搭建。

wangqiaowq的博客 3412

Docker+vLLM内网离线部署Qwen3 流程

本文介绍了在CentOS 7系统下进行VLLM容器化部署Qwen3-32B大模型的内网离线方案。首先需准备Nvidia显卡驱动、CUDA 12.4和Docker环境。通过联网机器拉取vllm/vllm-openai镜像并导入内网服务器,同时从魔塔社区下载模型文件。部署时使用docker run命令启动容器,配置了GPU资源、内存共享、端口映射等参数,特别指定了模型路径、并行计算、内存利用率等关键参数。该方案实现了大模型在内网环境的安全高效部署,适用于需要离线运行的AI推理场景。

qq_42881308的博客 1036

康托展开详解

qwq

qq_62224565的博客 1221

【华为OD机试】真题E卷-一种字符串压缩表示的解压(C++)

有一种简易压缩算法:针对全部为小写英文字母组成的字符串,将其中连续超过两个相同字母的部分压缩为连续个数加该字母,其他部分保持原样不变。例如:字符串aaabbccccd 经过压缩变成字符串 3abb4cd请您编写解压函数,根据输入的字符串, 判断其是否为合法压缩过的字符串若输入合法则输出解压缩后的字符串 否则输出字符串!error来报告错误。

u014481728的博客 892

康托展开(排列组合)

也就是说如果两个排列的某一位之前的数字都相同,那么如果这一位如果不相同,就按这一位排序。式中,a[i]表示原数第i位之前有几个比他小得数没有出现,并且有0

qq_73792226的博客 785

DFIG风电场经LCC-HVDC外送系统SIMULINK建模与仿真

本文基于MATLAB/Simulink平台构建了DFIG风电场经LCC-HVDC外送系统的仿真模型。系统采用1000MW聚合DFIG模型与双极12脉动LCC-HVDC连接,详细阐述了参数设计、控制策略及接口协调方法。重点解决了风电场无功能力不足、功率波动影响换相等关键技术问题,为大规模风电基地外送提供了仿真研究框架。模型整合了官方DFIG和HVDC详细模块,通过参数缩放和控制系统优化,实现了完整系统的动态仿真分析。

huanghm88的专栏 119

AI:240-YOLOv8高效涨点 |Swin Transformer的主干网络替换与优化(附代码 + 详细修改步骤 +原理介绍)

YOLOv8作为目标检测领域的最新版本,在速度和精度之间取得了良好的平衡。然而,随着计算机视觉任务的复杂性不断增加,YOLOv8的标准主干网络(Backbone)在处理高分辨率图像或多尺度目标时,可能存在一定的局限性。为了进一步提升YOLOv8的性能,我们可以引入Swin Transformer替换其主干网络,以增强模型的全局感知能力和多尺度特征提取能力。本文将详细介绍如何在YOLOv8中用Swin Transformer替换原有的Backbone,提供代码示例,并深入探讨其中的原理和效果。

一键难忘的博客 3956

康托展开总结

康托展开总结

ZhuRanCheng的博客 592

【JTAG】1149.6协议详解

JTAG1149.6协议是1149.1协议中Boundary-Scan结构的扩展,1149.1对交流耦合、差分或两者兼有的情况并没有得到充分的处理。该协议支持新的I/O测试结构。需要时变(AC)信号的高级I/O引脚允许测试它们之间的连接,这包括所有差分信号引脚或单端信号引脚,通过设计支持交流耦合。..................

xuhe0206的博客 4573

数论--康托展开与逆康托展开模板

#include<bits/stdc++.h> using namespace std; const int MAX = 13; int Fac[MAX],N; //求出阶乘 void init(){ Fac[0] = 1; for(int i=1;i<=N;++i){ Fac[i] = Fac[i-1]*i; } } //康托展开 in...

日拱一卒,功不唐捐 3259

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

[模板] 康托展开和逆展开

感谢ZLY告诉我这个知识点 附上比较不错的模板 https://www.cnblogs.com/Howe-Young/p/4348777.html 例题: http://nyoj.top/problem/139(康托展开) http://nyoj.top/problem/143(康托逆展开) 此题是理解康托展开非常好的例子 就该题而言会不会康托展开都会想到用排列组合计算比该序列小的序...

Zeolim的博客 409

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

康托展开与逆展开(原理+模板)

定义: 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的名次,因此是可逆的。 原理: 代表在位置i后面且小于的值得个数 (n-k)!代表阶乘 康托展开代码: const int fact[10]={1,1,2,6,24,120,720,5040,40320,362880}; int cantor(int ...

Falcon的博客 1548

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

康托展开+逆康托展开 模板和简单的讲解 例题: poj 1077 Eight A*+康托

先放模板: //封装康托与逆康托 const int N = 10; //有1~N个数需要康托展开 struct Cantor { #define lowbit(i) (i&(-i)) int c[N], pre[N]; //初始化 void init() { pre[1] = 1; for (int i = 2; i <= 9; i++) pre[i] =...

forOnward的博客 414

康托展开与逆康托展开(模板)

康托展开 求1 ~ n的某个排列在1 ~ n的全排列中的排名。 用b数组记录每个数在它之前没有出现的比它小的数的个数,第i个数的结果存放至b[n-i+1]。 排名ans=b[1] * 0!+b[2] * 1!+···+b[n] * (n-1)!+1,其中+1之前求得的比给定排列小的排列数,+1之后就是其排名。 证明: b[i]*(i-1)!表示的是前i-1位与给定排列相同的情况下比给定排列小的排列个数。没了。 code:线段树优化,nlogn。 update(1,1,n,a[1],a[1],1);

gyp0205的博客 234

康托展开,逆康托展开,原理分析,题目练习

对于 lemher[n - 1],它的贡献是 lemher[n - 1] * 0!对于 lemher[n - 2],它的贡献是 lemher[n - 2] * 1!n 个元素构成的排列的排名为 所有排列按字典序升序下的排名,比如 “1234” 的排名就是 1。一个直接的方法是,预处理阶乘,然后权值树状数组初始化所有数字权值为1,然后顺序根据排名填写。康托展开是指一种将自然数展开为数列的方法,类似于试填法 / 数位dp,从而求出排列的排名。加1 是因为我们试填算的是字典序严格小于该排列的排列数。

EQUINOX1的博客 1027

康托展开与逆康托展开算法模板

const int N =21; ll fac[N]; void init(){ fac[0] = 1; for (int i =1; i < 21; i++) { fac[i] = fac[i - 1] * i; } } ll contor(int n,int s[]) { ll rnk = 0, cnt; for (int...

gzr2018的博客 118

[USACO11FEB]牛线Cow Line【康托展开与逆康托展开 模板题】

P3014 [USACO11FEB]牛线Cow Line 就是简单的模板题了,这里分别用了BIT来进行优化,用了线段树来求第K小,用了树状数组去维护有多少“>”它本身的数。二进制优化时间。 但是别忘了初始化树状数组,不然要出事的! #include <iostream> #include <cstdio> #include <cmath> ...

既然弱小,就只顾变强就是了 335

康托展开与逆康托展开模板(O(n^2)/O(nlogn))

O(n2)方法: 1 namespace Cantor { 2 const int N=100; 3 int fac[N]; 4 void init() { 5 fac[0]=1; 6 for(int i=1; i<N; ++i)fac[i]=fac[i-1]*i; 7 } 8 int...

weixin_30488313的博客 266

数论--模板整理

数论–康托展开与逆康托展开模板 数学–数论–组合数(卢卡斯+扩展卢卡斯)模板 数学–数论–Miller_Rabin判断素数 数论–中国剩余定理模板 数学–数论–逆元(拓展欧几里得)模板 ...

日拱一卒,功不唐捐 2775

SSL1377 编码II 题解

(1377.编码II)题解 题目大意: 输入一个排列(长度小于50),输出它是第几个排列! 第一个排列为0 分析: 求这个排列是第几个,我们先要学一个叫康拓展开的东西 康拓展开定义: 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的名次,因此是可逆的。 另外康托展开解决的是当前序列在全排序的名次的问题,也就是问题所求。 康拓展开公式: X=a[n](n-1)!+a[n-1](n-2)!+a[n-2]*(n-3)!+…+a[1]*

FKJDASOI的博客 237

康拓展开+康拓逆展开(构造按字典序排序的第n个排列)

康拓展开模板 #include using namespace std; int fac[] = {1,1,2,6,24,120,720,5040,40320}; //i的阶乘为fac[i] /* 康托展开. {1...n}的全排列由小到大有序,s[]为第几个数 */ int KT(int n, int s[]) { int i, j, t, sum; sum =

哇哈哈的专栏 975

数论是个坑9-康拓展开和逆展开

康拓展开和逆展开 讲解: 这篇文章写的很好,看这个就可以了:传送门 直接给模版把: 康托展开: //s[] 表示输入进来的那个序列, n表示总共多少个元素 int cantor(int s[], int n) { int ans = 0; int tmp; for (int i = 0; i &amp;lt; n - 1; i++) { ...

LiuKairui的博客 486
上一篇: ZOJ Crusaders Quest (2017CCPC秦皇岛赛区)
下一篇: hihoCoder 1632 secret poem (2017北京赛区)
Link_Ray
博客等级 码龄9年 44粉丝 156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值