ACM常用模板合集

#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;}
}
//康托展开
int Cantor(int *x){int res = 0;for(int i=1;i<=N;++i){int Count = 0;for(int j=i+1;j<=N;++j){if(x[j] < x[i])Count++;}res += Fac[N-i]*Count;}return res;
}
//逆康托展开
void DeCantor(int pos,int *x){set<int> st;for(int i=1;i<=N;++i){st.insert(i);}for(int i=1;i<=N;++i){int r = pos / Fac[N-i];int l = pos % Fac[N-i];pos = l;set<int>::iterator it;int Count = 0;for(it = st.begin();it != st.end();++it){Count++;if(Count == r+1){break;}}x[i] = *it;st.erase(it);}
}
int main(void){int x[MAX],pos;cin >> N;init();cin >> pos;DeCantor(pos,x);cout << "DeCantor:" << endl;for(int i=1;i<=N;++i){cout << x[i] << " ";}cout << endl;cout << "Cantor:" << endl;cout << Cantor(x) << endl;return 0;
}

风格2:

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;
}
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. 数学--数论--康托展开与逆康托展开

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

  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. mac 显示隐藏文件
  2. DevExpress的TextEdit控件没法调整高度解决
  3. 使用VS Code进行远程连接
  4. 问题一:使用AndroidDriver而非原来的AppiumDriver的原因
  5. 怎样成为一名更优秀的程序员?我总结出 7 条建议,希望对你们有帮助!
  6. NeHe OpenGL第二十五课:变形
  7. Pytorch:线性代数
  8. 关于linux内核中使用的时钟
  9. Android开发笔记(九十八)往图片添加部件
  10. 火狐 mysql插件_火狐firebug和firepath插件安装方法(最新)
  11. Java String 类型对象不能改变
  12. XP不能访问Win7共享
  13. matlab 平滑曲线连接_MATLAB画图
  14. ps安装了可以打开但开始里面找不到_PS CC2017安装教程【64/32位】
  15. python爬取上证50ETF成分股信息
  16. 免费4s店汽车保养维修记录查询的方式
  17. java软引用_什么是软引用? 有什么作用
  18. linux里面查找替换命令,LINUX 查找替换命令 总结
  19. linux 服务器中文乱码问题解决
  20. Android卡顿优化分析

热门文章

  1. HTML与CSS基础之常用选择器(一)
  2. iOS库--.a与.framework
  3. cassandra随机获取数据,Cassandra适合写入和少读,HBASE随机读取写入
  4. Spring系列教程八: Spring实现事务的两种方式
  5. 深度思考的能力,决定了你能走多远
  6. html area图片热点
  7. Python - 利用pip管理包
  8. 一步步学习ASP.NET MVC3 (10)——@Ajax,JavaScriptResult(1)
  9. sicily 1021. Couples 栈
  10. 淘宝技术沙龙「系统稳定性与性能」的笔记与思考