2-25 A 第Q个全排列

题目:

现有一个长度为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;
}
发布了34 篇原创文章 · 获赞 6 · 访问量 1361

猜你喜欢

转载自blog.csdn.net/qq_44669377/article/details/104502850
今日推荐