描述

现在有"abcdefghijkl”12个字符,将其按字典序排列,如果给出任意一种排列,我们能说出这个排列在所有的排列中是第几小的。但是现在我们给出它是第几小,需要你求出它所代表的序列.

输入

第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个整数m,它代表着序列的第几小;

输出

输出一个序列,占一行,代表着第m小的序列。

样例输入

3
1
302715242
260726926

样例输出

abcdefghijkl
hgebkflacdji
gfkedhjblcia
解题思路:逆康托展开:就是根据某个排列的在所有全排列中的名次来确定这个排列。比如求1234的所有排列中排第20的排列是啥,那么就利用辗转相除法确定康托展开中每一项的系数k,然后每次输出当前未出现过的第k个元素即可。
下面演示一下计算过程:因为康托展开值是统计比第k个排列小前面所有排列的个数,所以求第20个排列对应的康托展开值应减1-->为19。
用19/3!=3...余1,说明首元素排在未出现元素的第3个(从下标0开始算),即首位为4;
用1/2!=0...余1,说明第二个元素排在未出现元素的第0个,即第二个元素为1;
用1/1!=1...余0,说明第三个元素排在未出现元素的第1个,即第三个元素为3;
最后一位自然就是2,所以1234的所有排列中排第20位的排列为4132。
AC代码:
 #include<bits/stdc++.h>
using namespace std;
typedef long long LL;
char str[];LL n,m,pos,j,k,len,tmp,fac[];bool flag[];
LL getfac(int n){//打印阶乘表
if(n==)return ;
LL ans=;
for(int i=;i<=n;++i)ans*=i;
return ans;
}
int main(){
for(int i=;i<;++i)fac[i]=getfac(i);//阶乘表
while(cin>>n){
while(n--){
cin>>m;k=;len=;m--;//m减掉次序1才是第m个排列的康托展开值
memset(flag,false,sizeof(flag));//初始化为未标记状态
for(LL i=;i<len;++i){
tmp=m/fac[len-i-];
for(j=;j<len-;++j){//遍历12个字符,找到还未出现的字母序列中的第tmp个
if(!flag[j]){
if(tmp==)break;
tmp--;
}
}
str[k++]='a'+j;
flag[j]=true;//标记第tmp个元素已出现
m%=fac[len-i-];
}
str[len-]='\0';
cout<<str<<endl;
}
}
return ;
}

题解报告:NYOJ 题目143 第几是谁?(逆康托展开)的更多相关文章

  1. 题解报告:poj 2299 Ultra-QuickSort(BIT求逆序数)

    Description In this problem, you have to analyze a particular sorting algorithm. The algorithm proce ...

  2. nyoj 139——我排第几个|| nyoj 143——第几是谁? 康托展开与逆康托展开

    讲解康托展开与逆康托展开.http://wenku.baidu.com/view/55ebccee4afe04a1b071deaf.html #include<bits/stdc++.h> ...

  3. 2015浙江财经大学ACM有奖周赛(一) 题解报告

    2015浙江财经大学ACM有奖周赛(一) 题解报告 命题:丽丽&&黑鸡 这是命题者原话. 题目涉及的知识面比较广泛,有深度优先搜索.广度优先搜索.数学题.几何题.贪心算法.枚举.二进制 ...

  4. cojs 强连通图计数1-2 题解报告

    OwO 题目含义都是一样的,只是数据范围扩大了 对于n<=7的问题,我们直接暴力搜索就可以了 对于n<=1000的问题,我们不难联想到<主旋律>这一道题 没错,只需要把方程改一 ...

  5. 题解报告:hdu 2069 Coin Change(暴力orDP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2069 Problem Description Suppose there are 5 types of ...

  6. CF1169(div2)题解报告

    CF1169(div2)题解报告 A 不管 B 首先可以证明,如果存在解 其中必定有一个数的出现次数大于等于\(\frac{m}{2}\) 暴力枚举所有出现次数大于等于$\frac{m}{2} $的数 ...

  7. CFEducational Codeforces Round 66题解报告

    CFEducational Codeforces Round 66题解报告 感觉丧失了唯一一次能在CF上超过wqy的机会QAQ A 不管 B 不能直接累计乘法打\(tag\),要直接跳 C 考虑二分第 ...

  8. CF Round #580(div2)题解报告

    CF Round #580(div2)题解报告 T1 T2 水题,不管 T3 构造题,证明大约感性理解一下 我们想既然存在解 \(|a[n + i] - a[i]| = 1\) 这是必须要满足的 既然 ...

  9. cojs 二分图计数问题1-3 题解报告

    OwO 良心的FFT练手题,包含了所有的多项式基本运算呢 其中一部分解法参考了myy的uoj的blog 二分图计数 1: 实际是求所有图的二分图染色方案和 我们不妨枚举这个图中有多少个黑点 在n个点中 ...

随机推荐

  1. redis connetced refused remote

    239down vote I've been stuck with the same issue, and the preceding answer did not help me (albeit w ...

  2. JAVA学习第六十四课 — 反射机制

       Java反射机制是在执行状态中,对于随意一个类,都可以知道这个类的全部属性和方法,对于随意一个对象,都可以调用它的随意一个方法和属性,这样的动态获取的信息以及动态调用对象的方法的功能称为java ...

  3. Android开发:怎样隐藏自己的app应用

    本文主要介绍怎样通过改动AndroidManifest.xml清单文件来达到隐藏自身应用的目的,不是隐藏第三方应用.为了不浪费大家时间.特此说明. 转载请注明作者xiong_it和链接:http:// ...

  4. 自定义实现JavaScript的Map对象,修改IE不兼容MAP()的问题

    由于IE8及以下版本不支持Map对象,本文为程序猿们提供了有效的解决方法. 本文重写了Map对象,实现了常用的set, get, put, clear, remove, delete, forEach ...

  5. Android 4.4.2 动态加入JNI库方法记录 (二 app应用层)

    欢迎转载,务必注明出处:http://blog.csdn.net/wang_shuai_ww/article/details/44458553 源代码下载地址:http://download.csdn ...

  6. RK3288-OTA编译失败解决办法【转】

    本文转载自:http://blog.csdn.net/wangxueming/article/details/52448630 在执行make  otapackage的时候出现该错误,是由于drmsi ...

  7. YTU 2983: 小明的生机!

    2983: 小明的生机! 时间限制: 1 Sec  内存限制: 128 MB 提交: 16  解决: 2 题目描述 小明陷入一个充满陷阱的密道之中,现在他要逃脱这里!到达密道的指定位置即可离开这处绝境 ...

  8. spring各个jar作用

    spring.jar --->包含完整发布模块的单个jar,但是不包括mock.jar,aspects.jar,spring-porltet.jar,spring-hibernate2.jar ...

  9. 【HDU 1561】 The More,The better

    [题目链接] 点击打开链接 [算法] 树形背包 注意是一棵森林 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN ...

  10. python的thread和threading区别

    python提供了多种模块用来支持多线程编程, thread(在python3中改名为_thread),threading,和 queue模块. 通过加入queue模块,用户可以创建多个线程共享数据的 ...