康托展开--light OJ 139 --我排第几位
来源:互联网 发布:淘宝付费软件的 编辑:程序博客网 时间:2024/04/30 20:24
康托展开定义
X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! 其中,a为整数,并且0<=ai<i(1<=i<=n)。
{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是第三个小数。
逆运算
例1 {1,2,3,4,5}的全排列,并且已经从小到大排序完毕
(1)找出第96个数
首先用96-1得到95
用95去除4! 得到3余23
有3个数比它小的数是4
所以第一位是4
用23去除3! 得到3余5
有3个数比它小的数是4但4已经在之前出现过了所以第二位是5(4在之前出现过,所以实际比5小的数是3个)
用5去除2!得到2余1
有2个数比它小的数是3,第三位是3
用1去除1!得到1余0
有1个数比它小的数是2,第二位是2
最后一个数只能是1
所以这个数是45321
(2)找出第16个数
首先用16-1得到15
用15去除4!得到0余15
用15去除3!得到2余3
用3去除2!得到1余1
用1去除1!得到1余0
有0个数比它小的数是1
有2个数比它小的数是3 但由于1已经在之前出现过了所以是4(因为1在之前出现过了所以实际比4小的数是2)
有1个数比它小的数是2 但由于1已经在之前出现过了所以是3(因为1在之前出现过了所以实际比3小的数是1)
有1个数比它小得数是2 但由于1,3,4已经在之前出现过了所以是5(因为1,3,4在之前出现过了所以实际比5小的数是1)
最后一个数只能是2
所以这个数是14352
#include<cstdio>#include<cstring>#include<iostream>using namespace std;char str[10006];int s[11]={1,2,6,24,120,720,5040,40320,362880,3628800,39916800};int main(){ int i,j,t; scanf("%d",&t); while(t--) { scanf("%s",str); long long len=strlen(str); long long sum=0; long long countx=0; for(i=len-2;i>=0;i--) { long long k=0; for(j=i+1;j<len;j++) { if(str[i]>str[j]) k++; } sum+=(k*s[countx++]); } printf("%lld\n",sum+1); } return 0;}
- 康托展开--light OJ 139 --我排第几位
- 我排第几个---康托展开
- nyist - 139 - 我排第几个【康托展开应用】
- nyoj-139-我排第几个(康托展开)
- NYOJ 139 我排第几个(康托展开)
- nyoj 139 我排第几个【数学】【康托展开】
- nyoj 139我排第几个(康托展开)
- NYOJ 139 我排第几个(康托展开)
- nyist 139 我排第几个&&143 第几是谁(康托展开和逆康托展开)
- 康托展开式---我排第几+逆康托展开
- NYOJ139我排第几个(康托展开)
- NYOJ139 我排第几个【康托展开】
- 康托展开-nyoj-我排第几个
- 我排第几个——康托展开
- 我排第几 第几是谁? 康托展开与逆康托展开
- (康托展开解释)+ NYOJ 139 我排第几个
- 康托展开之我排第几个与裸康托逆展开之nyoj143
- NYOJ139 我排第几个(数论,康托展开模板题)
- C 语言的可变参数表函数的设计
- 我们离人工智能有多远?
- IE hasLayout的问题总结
- 导出excel代码和思路
- c++的虚析构函数和纯虚析构函数
- 康托展开--light OJ 139 --我排第几位
- 面试心情
- WIKI 【1295 N皇后问题 】DFS
- PHP中的标量是什么?定义的常量能够是数组吗?
- 求建议
- 对上个小东西利用JOptionPane实现感觉好烦的
- 我很容易上当吗?
- android - JNI - 一维数组、二维数组的访问与使用
- 阿布学排序之堆排序