康托展开

可以理解为把一个全排列映射到一个数上面,因为全排列如果按照从小到大或者从大到小,肯定是有一个确定的序列的。

一般是从小到大的序列个数。我们就是要求出这个序列的位置。,想法很简答,就是求出前面比他小的个数就可以了。

理解为一个每位都是阶乘进位的数转化为10进制的数。思路如下:
先准备求每一位的阶乘,然后从高位开始统计后面有多少个数比他小记录这个个位数,然后乘以后面个数的阶乘,再把它累加起来。

x[i]表示第i位后面比他小的个数,那么

∑1Nx[i]∗Fac[N−i]\sum_{1}^{N}x[i]*Fac[N-i] 1∑N​x[i]∗Fac[N−i]
这样就能求出比他小的有多少个了,也能求出他是第几个序列。

//求出阶乘
void init(){Fac[0] = 1;for(int i=1;i<=N;++i){Fac[i] = Fac[i-1]*i;}
}int kangtuo(int n,char a[])
{int i,j,t,sum;sum=0;for( i=0; i<n ;++i){t=0;for(j=i+1;j<n;++j)if( a[i]>a[j] )++t;sum+=t*fac[n-i-1];}return sum+1;
}

逆康托展开

相当于知道序列位置求这个位置的数。
想法也很简单,因为对于每位的Fac[N-i]都比后面说有的和都大,所以用pos/Fac[N-1]求得的就是x[i],同理pos%Fac[N-i]就是后面的和。

我们维护一个序列st始终按照从小到大排列,那么已知某位置的x[i],那么这个位置的数就是st[x[i]+1]。

void init(){Fac[0] = 1;for(int i=1;i<=N;++i){Fac[i] = Fac[i-1]*i;}
}
void reverse_kangtuo(int n,int k,char s[])
{int i, j, t, vst[8]={0};--k;for (i=0; i<n; i++){t = k/fac[n-i-1];for (j=1; j<=n; j++)if (!vst[j]){if (t == 0) break;--t;}s[i] = '0'+j;vst[j] = 1;k %= fac[n-i-1];}
}

数学--数论--康托展开与逆康托展开相关推荐

  1. 康托展开和逆康托展开

    简述 康托展开是一个全排列到一个自然数的双射,常用于构建hash表时的空间压缩.设有n个数(1,2,3,4,-,n),可以有组成不同(n!种)的排列组合,康托展开表示的就是是当前排列组合在n个不同元素 ...

  2. 康拓展开与逆康拓展开

    康托展开与逆康托展开   康托展开据我所理解,应该便是给你一个已知的排列,然后这个排列在全排列中是第几小或者第几大的,一般都是按字典序计算,即为第几小的.康托展开的公式为:X=a[n]*(n-1)!+ ...

  3. 康拓展开和逆康拓展开

    康托展开 公式:X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! ,其中a[i]为当前未出现的元素中(即后面的所有元素中)是排在第几个(从 ...

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

    ACM常用模板合集 #include<bits/stdc++.h>using namespace std; const int MAX = 13; int Fac[MAX],N; //求出 ...

  5. 基本算法——康托展开与逆康托展开

    含义 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩. 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的. 原理 X = s1(n-1)! + s2(n-2 ...

  6. 详解康托展开与逆康托展开

    康托展开 rank=an(n−1)!+an−1(n−2)!+⋯+a10! 再举个例子说明. 在(1,2,3,4,5)5个数的排列组合中,计算 34152的康托展开值. 首位是3,则小于3的数有两个,为 ...

  7. 康托展开与逆康托展开详解

    文章目录 康拓展开 运用 板子 逆康托展开 板子 康拓展开 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩. 康托展开的实质是计算当前排列在所有由小到大全排列中的名次,因此是可逆 ...

  8. 关于康托展开和逆康托展开详解,及python代码

    在LeetCode上有这样一道题: 60. 第k个排列 给出集合 [1,2,3,-,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: ...

  9. 康托展开与逆康托展开(bzoj 3301: [USACO2011 Feb] Cow Line)

    康拓展开: 已知序列a1, a2, a3, -, an是1~n的一个排列,求这是1~n全排列中,第几小的排列? ans = ,其中F(i)表示后面n-i个数中比当前小的数的个数 例如 n = 5,序列 ...

最新文章

  1. Swift: 可变参数
  2. 税务系统问题分析 来自CSNA论坛
  3. 认识 Linux 系统结构
  4. 石牌村中的美好 ...
  5. [Unity] 战斗系统学习 5:构建 TPS 框架 1
  6. 算法:动态规划算法的最佳实践-背包问题
  7. 类型的值怎么用es查询_腾讯游戏信用分怎么查询在哪看 有什么用怎么提升介绍...
  8. 我的世界服务器改地皮生态系统,我的世界服务器怎么把地皮世界改为和平模式?...
  9. Elasticsearch--进阶-Query DSL基本使用和match_all---全文检索引擎ElasticSearch工作笔记010
  10. Redis2.8的安装教程,linux下
  11. Axure企业官网通用模板web端+公司官网通用模板web端高保真原型+服务企业门户官网+加入我们+在线招聘+企业宣传+新闻动态+企业理念+产品与服务+公司通用版官方电脑端门户网站
  12. cp105b linux 驱动,富士施乐 DocuPrint CP105b驱动
  13. 如何安装老版本Eclipse汉化——以2020-06为例
  14. 计算机虚拟仿真专业,计算机虚拟仿真实验教学中心
  15. java计算机毕业设计网上书店商城源码+系统+数据库+lw文档+mybatis+运行部署
  16. Linux 系统中如何恢复已删除的文件?
  17. 【论文下饭】Temporal Graph Network for Deep Learning on Dynamic Graphs
  18. tt作曲家简谱打谱软件_作曲家入门指南
  19. SEO培训联盟排名掉的原因:宋星博客?
  20. 多旋翼无人机组合导航系统-多源信息融合算法附Matlab代码

热门文章

  1. ISA Best Practices Analyzer Tool
  2. spark2.0.1安装部署及使用jdbc连接基于hive的sparksql
  3. jQuery 3.0 的 setter/getter 模式
  4. 初来乍到?请多关照==23333
  5. SharePoint 使用脚本为表单绑定事件
  6. json类的解析,调试实例
  7. jquery 清空表单
  8. 一点一点学ASP.NET之基础概念——HTTP运行期与页面执行模型
  9. python一维数组合并_Python编程:如何将多个一维数组的元素交叉拼接成新的一维数组...
  10. Ext FormPanel布局 (一行显示两对控件元素)