hdu 1027 康托展开求全排列
2015-07-28 15:13
120 查看
{1,2,3,4,...,n}表示1,2,3,...,n的排列如 {1,2,3} 按从小到大排列一共6个。123 132 213 231 312 321 。
代表的数字 1 2 3 4 5 6 也就是把10进制数与一个排列对应起来。
他们间的对应关系可由康托展开来找到。
如我想知道321是{1,2,3}中第几个小的数可以这样考虑 :
第一位是3,当第一位的数小于3时,那排列数小于321 如 123、 213 ,小于3的数有1、2 。所以有2*2!个。再看小于第二位2的:小于2的数只有一个就是1 ,所以有1*1!=1 所以小于321的{1,2,3}排列数有2*2!+1*1!=5个。所以321是第6个小的数。 2*2!+1*1!+0*0!就是康托展开。
再举个例子:1324是{1,2,3,4}排列数中第几个大的数:第一位是1小于1的数没有,是0个 0*3! 第二位是3小于3的数有1和2,但1已经在第一位了,所以只有一个数2 1*2! 。第三位是2小于2的数是1,但1在第一位,所以有0个数 0*1! ,所以比1324小的排列有0*3!+1*2!+0*1!=2个,1324是第三个小数。
根据这个原理就可以轻易地求出结果。由于m<=10000,8!=40320,所以我们只需要算n的后8位就好
代表的数字 1 2 3 4 5 6 也就是把10进制数与一个排列对应起来。
他们间的对应关系可由康托展开来找到。
如我想知道321是{1,2,3}中第几个小的数可以这样考虑 :
第一位是3,当第一位的数小于3时,那排列数小于321 如 123、 213 ,小于3的数有1、2 。所以有2*2!个。再看小于第二位2的:小于2的数只有一个就是1 ,所以有1*1!=1 所以小于321的{1,2,3}排列数有2*2!+1*1!=5个。所以321是第6个小的数。 2*2!+1*1!+0*0!就是康托展开。
再举个例子:1324是{1,2,3,4}排列数中第几个大的数:第一位是1小于1的数没有,是0个 0*3! 第二位是3小于3的数有1和2,但1已经在第一位了,所以只有一个数2 1*2! 。第三位是2小于2的数是1,但1在第一位,所以有0个数 0*1! ,所以比1324小的排列有0*3!+1*2!+0*1!=2个,1324是第三个小数。
根据这个原理就可以轻易地求出结果。由于m<=10000,8!=40320,所以我们只需要算n的后8位就好
#include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> using namespace std; int m,n,k; int f[8]={1,1,2,6,24,120,720,5040}; bool g[10000]; int s[10000]; int main() { while (scanf("%d%d",&n,&m)!=EOF) { memset(g,0,sizeof(g)); int i,q=0; if (n>8) { i=n; while (i>8) { s[q]=q+1; g[q+1]=1; i--; q++; } } else i=n; m--; while (i) { k=m/f[i-1]; m=m%f[i-1]; for (int j=1;j<=n;j++) { if (g[j]) continue; if (!k) {s[q++]=j; g[j]=1; break;} k--; } i--; } printf("%d",s[0]); for (int i=1;i<n;i++) printf(" %d",s[i]); printf("\n"); } return 0; }
相关文章推荐
- kunter-generator
- Binary Tree Level Order Traversal II
- PHP的安全配置
- C语言中的函数指针
- HDU2819 Swap (二分图匹配)
- Linux C语言程序设计(九)——gdb调试
- 一个label里面 显示中文和英文不同的颜色
- 中谷教育01 走进 python
- js格式化时间
- 一个label 里面 显示中文和英文不同颜色
- [题解+总结]20150528
- IOS第四天(4:下一题和选框的实现)
- C++ 排序函数 sort(),qsort()的用法
- Java获取当前时间的年月日方法
- ios总结控件(delegate1)
- JAVADOC有关命令简析
- window.location.href/replace/reload()--页面跳转+替换+刷新
- [LeetCode][Java] Valid Palindrome
- 动画模拟实现电梯的载客运行过程
- Depth Bias 以及 Ogre材质中的depth_bias