表示这个东西背了很多次,但是次次忘,希望这次能够记住吧。

康托展开:
问45231是n=5的全排列中第几个排列?
ans:= 3*4! + 3*3! + 1*2! + 1*1! + 0*0! =93
这时求出的是在45231前面全部的排列,排名还要加1
所以对此的做法,就是将阶乘前面的求出来,这个就是在a[i]前面,还没出现过的数字。比如4前面1~3都没出现而1(或2或3)xxxx肯定在4xxxx前面,因为有四个不定的数字,所以乘上4!

逆运算:
问n=5的全排列中第94个是谁?94先-1
94/4!=3.875
所以第一个数字前面有3个数字
94先减3*4!=22
22/3!=3.6666666666666666666666666666667
前面还是有三个,因为4之前用过了,所以是5
由此类推。这个东西常用于状态压缩的。

模板题caioj1220:

#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
int n,a[20];
LL jc[20];
bool bo[20];
void kangtuo1()
{jc[0]=1;for(int i=1;i<=n;i++){scanf("%d",&a[i]);jc[i]=jc[i-1]*i;}LL ans=0;//有多少个这个全排列前面的 memset(bo,false,sizeof(bo));//这个有没有在前面出现过for(int i=1;i<=n-1;i++){ int k=0;//k表示前面有多少个没被访问过的for(int j=1;j<a[i];j++)if(bo[j]==false)k++;bo[a[i]]=true;//当前这个数被访问过 ans+=k*jc[n-i];//乘以当前个数的阶乘
    }printf("%lld\n",ans+1);
}
void kangtuo2()
{LL ans;scanf("%lld",&ans);ans--; memset(bo,false,sizeof(bo)); for(int i=1;i<=n;i++){LL k=ans/jc[n-i];//有多少个比第i个位置小的数 ans-=k*jc[n-i];for(int j=1;j<=n;j++)if(bo[j]==false){if(k==0){a[i]=j;bo[a[i]]=true;break;}k--;}}for(int i=1;i<n;i++)printf("%d ",a[i]);printf("%d\n",a[n]);
}
int main()
{scanf("%d",&n);kangtuo1();kangtuo2();return 0;
}

转载于:https://www.cnblogs.com/AKCqhzdy/p/7612601.html

关于数论【康托展开及其逆运算】相关推荐

  1. 康托展开及其逆运算 详解

    前文: 这个东东是我准备进攻一道A*算法的八数码题目时,遇到的. 决定先搞懂这个,再进攻八数码(传说中  不做人生不完整的 题目). 康托展开是什么? 定义: X=an*(n-1)!+an-1*(n- ...

  2. [总结] 康托展开及其逆运算

    这里先贴一道例题 我们先科普一下康托展开 定义: X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! ai为整数,并且0<=ai<i ...

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

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

  4. 数学--数论--康托展开与逆康托展开

    康托展开 可以理解为把一个全排列映射到一个数上面,因为全排列如果按照从小到大或者从大到小,肯定是有一个确定的序列的. 一般是从小到大的序列个数.我们就是要求出这个序列的位置.,想法很简答,就是求出前面 ...

  5. 康托展开式---我排第几+逆康托展开

    之前一直不想看这个康托展开定理因为真的很不理解,但是现在还是勇敢的面对了~  {1,2,3,4,...,n}表示1,2,3,...,n的排列如 {1,2,3} 按从小到大排列一共6个.123 132 ...

  6. 关于康托展开的用途及写法

    在处理八数码这一类需要用到全排列的问题的时候, 存储往往是一个难题, 因为明明只有n!种情况, 数字的长度却有n, 用数组是肯定不行的. 这个时候, 康托展开就派上了用场, 当然, 在条件允许的情况下 ...

  7. 康托展开(基于全排列的某一种hash)

    康托展开: X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! ai为整数,并且0<=ai<i(1<=i<=n) 先举个 ...

  8. 康托展开和康托展开逆运算(Cantor unfold)

    康托展开 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩. 康托展开的实质是计算当前排列在所有由小到大全排列中的名次,因此是可逆的. 公式: X = A[0] * (n-1)! ...

  9. 康托展开详解 -csdn博客

    康托展开详解 -csdn博客 定义: 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩. 康托展开的实质是计算当前排列在所有由小到大全排列中的名次,因此是可逆的. 原理介绍 **X ...

最新文章

  1. visual paradigm 表示选择关系_css3选择器用法介绍
  2. 如何才能信任你的深度学习代码?
  3. BZOJ4001[TJOI2015]概率论——卡特兰数
  4. wgn和awgn函数
  5. onclick 获取img 里面的id_红魔5S游戏手机如何解锁bl获取第三方面具root权限
  6. 无线安全***--启程
  7. Coreseek Windows下安装调试
  8. jQuery实现checkbox的全选反选方法
  9. Android -- startActivityForResult和setResult
  10. 查询没有走索引_MySQL 如何正确的使用索引
  11. windows 批处理自学教程 基础篇
  12. php与ipa接口登录验证失败,thinkPHP5.0开发微信小程序登录接口signature验证失败
  13. 联合索引会创建几个索引_【1033期】分别谈谈联合索引生效和失效的条件
  14. myeclpse 8.5 小问题记录
  15. Java开发实用工具推荐
  16. 在python中for i in range是什么意思-Python for i in range ()用法详解
  17. cisp-pte渗透工程师考试总结
  18. 激光雷达障碍物检测与追踪实战——基于欧几里德聚类的激光雷达障碍物检测
  19. linux windows 共享 smbd 部署
  20. 我在B站读大学,大数据专业

热门文章

  1. 前端那些事之layui篇---实现栅格功能
  2. SharpGL学习笔记(一) 平台构建与Opengl的hello World
  3. UrlPager免费分页控件2.0版发布!
  4. 关于微软研究院(谢幸、郑宇研究员主导的)“智能城市”“智能生活”研究的一个归纳...
  5. 使用临界区 CRITICAL_SECTION 实现互斥
  6. 最课程阶段大作业05:污水处理系统以及百度地图
  7. ci 文件类型在禁止上传之列
  8. Android 3.0 r1中文API文档(104) —— ViewTreeObserver
  9. powerdesigner设置主键为自增字段,设置非主键为唯一键并作为表的外键
  10. 纯正价格正则表达式,请指正