第几是谁?

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
 
描述
现在有"abcdefghijkl”12个字符,将其按字典序排列,如果给出任意一种排列,我们能说出这个排列在所有的排列中是第几小的。但是现在我们给出它是第几小,需要你求出它所代表的序列.
 
输入
第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个整数m,它代表着序列的第几小;
输出
输出一个序列,占一行,代表着第m小的序列。
样例输入
3
1
302715242
260726926
样例输出
abcdefghijkl
hgebkflacdji
gfkedhjblcia
先了解下康拓展开和逆康拓展开。

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
long long fac[12]; //保存1-11的阶乘
fac[0]=fac[1]=1;
for(int i=2;i<12;i++)
fac[i]=fac[i-1]*i;

int n,a[12],b[12];
cin>>n;
while(n--)
{
int m;
cin>>m;
m--;
for(int i=0;i<12;i++)//记录每个字符在使用之前时候被使用过,
b[i]=i;

for(int i=0;i<12;i++)
{
int result;
result=m/fac[11-i]; //求比当前位置小的有几种情况
a[i]=b[result]; //比如:比有三个比***小的字符,则***=3+ASCII;

for(int j=result;j<11;j++) //比如:比有三个比***小的字符,则***=4+ASCII,但***已经出现过,所以
b[j]=b[j+1]; //****= 4+ASCII+1;
m-=result*fac[11-i];//康托展开:a[n]*(n-1)!+a[n-1]*(n-2)!+......+a[0]=sum;
} //则 a[n-1]*(n-2)!+......+a[0]=sum- a[n]*(n-1)!;

for(int i=0;i<12;i++)
printf("%c",a[i]+97);
cout<<endl;
}
return 0;
}

最新文章

  1. 传智播客DotNet面试题
  2. C语言程序设计第11次作业
  3. linux两个文件修改主机名
  4. Redis-sentinel监控
  5. RGBa颜色 css3的Alpha通道支持
  6. Hdu 5073 Galaxy 精度问题
  7. [转]理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用
  8. ThinkPHP中处理模板引擎的volist标签
  9. Discuz!另一处SSRF无须登陆无须条件
  10. SQL Update
  11. QLayout删除所有布局
  12. 常用Dockerfile举例
  13. hashlib 模块用来进行hash
  14. 基于CentOS搭建Nginx 静态网站
  15. spring3-mvc-maven-hello-world-master mvn jetty:run 及 mvn war:war 指令
  16. elasticsearch学习笔记——相关插件和使用场景
  17. header头参数不能带下划线
  18. laraver框架学习
  19. java学习第01天(程序开发体验)
  20. 第一章 关于html适应手机屏幕的写法

热门文章

  1. awk多分隔符功能及wc命令案列及企业级应用
  2. 关于Android attrs 自定义属性的说明
  3. Myeclipse配置tomcat,以及简单的Myeclipse的配置
  4. jqgrid 单元格引入时间datepicker控件
  5. 【Unity与23种设计模式】访问者模式(Visitor)
  6. PHP方法实现1-9数列中添加‘+’,‘-’或&#39;&#39;,使和为100,并输出数列
  7. MYSQL汇总
  8. java中一个引人深思的匿名内部类
  9. Java基础知识回顾之二 ----- 修饰符和String
  10. eclipse异常解决:Errors occurred during the build.........