题目:
现有一个长度为n的集合S,集合S里的元素为 [1,2,3……n]。按照高中数学的知识,我们显然可以知道,集合里的元素的排列共有 n! 种。现在给你集合长度n以及一个正整数 Q,请你找出集合元素组成的第Q个的排列。
输入:
输入数据由多组测试样例组成,每组测试样例第一行分别输入两个正整数n ( 1 <= n <= 9 ),Q( 1 <= Q <= n! )
输出:
输出第Q个的排列,元素之间没有空格
样例输入
2 2
5 10
样例输出
21
13452
思路:
自己写一部分样例。如果把数字每位从小到大排序。
1234。。。
1243。。。
1324。。。
1342。。。
1423。。。
1432。。。
就会发现每次Q先除以所需位数每组的个数(也就是如果是千位需要 3!( 3 * 2 * 1 ))
百位是 2!( 2 * 1 )
十位是 1! 1
就如N为4的时候Q要是给你的数据在6之内 千位为1
如果给你大于 6 小于等于 12 千位为2
每次取到一个数然后把所有数字重新排序。
结合AC代码
#include<bits/stdc++.h>
using namespace std;
long long a[9]={1,2,6,24,120,720,5040,40320,362880};
long long b[9];
long long n,q,c,sum;
int main(){
while(cin>>n>>q){
for(int i=0;i<n;i++){
b[i]=i+1;
}
sum=0;
for(int i=n;i>1;i--){
sum*=10;
sum+=b[(q-1)/a[i-2]];
b[(q-1)/a[i-2]]=100;
q=q%a[i-2];
if(q==0){
q=a[i-2];
}
sort(b,b+n);
}
sum*=10;
sum+=b[0];
cout<<sum<<endl;
}
return 0;
}