数论--康托展开与逆康托展开模板
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;
}
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];}
}
数论--康托展开与逆康托展开模板相关推荐
- 康托展开和逆康托展开
简述 康托展开是一个全排列到一个自然数的双射,常用于构建hash表时的空间压缩.设有n个数(1,2,3,4,-,n),可以有组成不同(n!种)的排列组合,康托展开表示的就是是当前排列组合在n个不同元素 ...
- 康拓展开与逆康拓展开
康托展开与逆康托展开 康托展开据我所理解,应该便是给你一个已知的排列,然后这个排列在全排列中是第几小或者第几大的,一般都是按字典序计算,即为第几小的.康托展开的公式为:X=a[n]*(n-1)!+ ...
- 康拓展开和逆康拓展开
康托展开 公式:X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! ,其中a[i]为当前未出现的元素中(即后面的所有元素中)是排在第几个(从 ...
- 数学--数论--康托展开与逆康托展开
康托展开 可以理解为把一个全排列映射到一个数上面,因为全排列如果按照从小到大或者从大到小,肯定是有一个确定的序列的. 一般是从小到大的序列个数.我们就是要求出这个序列的位置.,想法很简答,就是求出前面 ...
- 基本算法——康托展开与逆康托展开
含义 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩. 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的. 原理 X = s1(n-1)! + s2(n-2 ...
- 详解康托展开与逆康托展开
康托展开 rank=an(n−1)!+an−1(n−2)!+⋯+a10! 再举个例子说明. 在(1,2,3,4,5)5个数的排列组合中,计算 34152的康托展开值. 首位是3,则小于3的数有两个,为 ...
- 康托展开与逆康托展开详解
文章目录 康拓展开 运用 板子 逆康托展开 板子 康拓展开 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩. 康托展开的实质是计算当前排列在所有由小到大全排列中的名次,因此是可逆 ...
- 关于康托展开和逆康托展开详解,及python代码
在LeetCode上有这样一道题: 60. 第k个排列 给出集合 [1,2,3,-,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: ...
- 康托展开与逆康托展开(bzoj 3301: [USACO2011 Feb] Cow Line)
康拓展开: 已知序列a1, a2, a3, -, an是1~n的一个排列,求这是1~n全排列中,第几小的排列? ans = ,其中F(i)表示后面n-i个数中比当前小的数的个数 例如 n = 5,序列 ...
最新文章
- mac 显示隐藏文件
- DevExpress的TextEdit控件没法调整高度解决
- 使用VS Code进行远程连接
- 问题一:使用AndroidDriver而非原来的AppiumDriver的原因
- 怎样成为一名更优秀的程序员?我总结出 7 条建议,希望对你们有帮助!
- NeHe OpenGL第二十五课:变形
- Pytorch:线性代数
- 关于linux内核中使用的时钟
- Android开发笔记(九十八)往图片添加部件
- 火狐 mysql插件_火狐firebug和firepath插件安装方法(最新)
- Java String 类型对象不能改变
- XP不能访问Win7共享
- matlab 平滑曲线连接_MATLAB画图
- ps安装了可以打开但开始里面找不到_PS CC2017安装教程【64/32位】
- python爬取上证50ETF成分股信息
- 免费4s店汽车保养维修记录查询的方式
- java软引用_什么是软引用? 有什么作用
- linux里面查找替换命令,LINUX 查找替换命令 总结
- linux 服务器中文乱码问题解决
- Android卡顿优化分析
热门文章
- HTML与CSS基础之常用选择器(一)
- iOS库--.a与.framework
- cassandra随机获取数据,Cassandra适合写入和少读,HBASE随机读取写入
- Spring系列教程八: Spring实现事务的两种方式
- 深度思考的能力,决定了你能走多远
- html area图片热点
- Python - 利用pip管理包
- 一步步学习ASP.NET MVC3 (10)——@Ajax,JavaScriptResult(1)
- sicily 1021. Couples 栈
- 淘宝技术沙龙「系统稳定性与性能」的笔记与思考