关于全排列问题的总结(康托展开)
2014-09-13 21:46
253 查看
今天做USACO上一道题的时候用到了这个东西,当时觉得麻烦直接用map写了,然后仔细研究了一下,康托展开与其逆展开,个人觉得会在节省空间和表示状态上有比较大的帮助。
先来正展开吧,即给定排列序列,求是第几个排列,看序列中的第K位,假设序列长度为N,那么,K位之后的各位数全排列有(N-K)!种,然后看K之后的序列中有几个比K小的,
此时,把K*(N-K)!加入到计数变量即答案中即可,一个一个枚举K。
然后是康托逆展开,反过来,给定排列数,求序列,首先,我们每确定一位,就将这位上的数字标记,防止重读,然后就是对于第K位,假设序列长度为N,那么,K后边的序列的排列数是(N-K)!种,然后K是从小到大增加的,再设temp表示比第k位应放数字小的数字有几个,给定排列数为t,那么temp=t/(N-K)!,然后我们只要数到第temp+1个未被标记的数字填进来就可以了。注意更新t,还有就是可能为什么要选temp+1个未被标记的数这里,因为temp得到的是共有多少个(N-K)!,此时t-temp这个值哪怕是0,他也不属于temp那个值产生的序列了,啊啊啊,说的不是特别清楚,郁闷
先来正展开吧,即给定排列序列,求是第几个排列,看序列中的第K位,假设序列长度为N,那么,K位之后的各位数全排列有(N-K)!种,然后看K之后的序列中有几个比K小的,
此时,把K*(N-K)!加入到计数变量即答案中即可,一个一个枚举K。
#include <iostream> #include <cstring> #include <cstdio> using namespace std; char num[10]; int jie(int n) { if(n==0) return 1; int r=1; for(int i=2;i<=n;i++) r*=i; return r; } int main() { int t; while(cin>>t){ sprintf(num,"%d",t); int r=0,pos=0; int len=strlen(num); for(int i=0;i<len;i++){ int temp=0; for(int j=i+1;j<len;j++) if(num[j]<num[i]) temp++; r+=temp*jie(len-i-1); } cout<<r+1<<endl; } return 0; }
然后是康托逆展开,反过来,给定排列数,求序列,首先,我们每确定一位,就将这位上的数字标记,防止重读,然后就是对于第K位,假设序列长度为N,那么,K后边的序列的排列数是(N-K)!种,然后K是从小到大增加的,再设temp表示比第k位应放数字小的数字有几个,给定排列数为t,那么temp=t/(N-K)!,然后我们只要数到第temp+1个未被标记的数字填进来就可以了。注意更新t,还有就是可能为什么要选temp+1个未被标记的数这里,因为temp得到的是共有多少个(N-K)!,此时t-temp这个值哪怕是0,他也不属于temp那个值产生的序列了,啊啊啊,说的不是特别清楚,郁闷
#include <iostream> #include <cstring> #include <cstdio> using namespace std; char num[100]; bool is[10]; int jie(int n) { if(n==0) return 1; int r=1; for(int i=2;i<=n;i++) r*=i; return r; } int main() { int t,len; while(cin>>t>>len){ memset(num,0,sizeof(num)); memset(is,false,sizeof(is)); t--; for(int i=1;i<=len;i++){ int temp=t/jie(len-i),j,total; t-=temp*jie(len-i); for(j=1,total=0;total<=temp;j++) if(!is[j]) total++; j--; is[j]=true; num[i-1]='0'+j; } cout<<num<<endl; } return 0; }
相关文章推荐
- 这是我们公司总结的一些关于中文乱码问题的一些解决方案和经验和大家分享!
- 关于ASP.NET在IIS一些问题的经验总结
- 关于asp.net Session丢失问题的总结
- 关于ASP.NET在IIS一些问题的经验总结
- 关于数据库设计中的分级分层问题的总结(适用于组织结构图及家谱等问题)
- 关于XP的互连问题的总结
- JAVA与C++::关于JNI中文字符串操作问题总结
- 关于在ECLIPSE中配置weblogic的问题总结:
- 关于asp.net Session丢失问题的总结
- 这是我们公司总结的一些关于中文乱码问题的一些解决方案和经验和大家分享!
- 关于C++类的问题总结(一)
- 关于ASP.NET在IIS一些问题的经验总结(zz)
- [总结]关于VS2002下的项目迁移到VS2005下相关问题总结
- 这是我们公司总结的一些关于中文乱码问题的一些解决方案和经验和大家分享!
- 关于解决WebSphere服务不能启动问题的几点经验总结
- [导入]关于ASPNET在IIS一些问题的经验总结
- 【关于ASP.NET在IIS一些问题的经验总结】
- [企业信息化]关于LCS2005的安装总结,但还有很多问题没有解决,希望能够对象我一样的新手有所帮助
- 关于局域网共享访问问题总结 推荐
- 关于手机的IMEI号问题的一些总结