第M个数列
问题描述
给定1到N的序列,我们定义1,2,3 …N-1,N是由1到N组成的所有序列中的最小序列(每个数字只能使用一次)。则很容易看出,第二个最小的序列是1,2,3 … N,N-1。
现在,给定两个数字N和M,请告诉由数字1到N组成的第M个最小的序列是什么。
输入
输入包含多组测试数据,请处理到文件结束。
每组测试数据包含两个整数N和M(1<=N<=1000, 1<=M<=10000)。
数据保证一定有满足要求的数列。
输出
请输出满足要求的数列。数列的两个数之间用1个空格隔开,并且最后一个数后面没有空格。
每组数据输出一行。
样例输入
6 4
11 8
样例输出
1 2 3 5 6 4
1 2 3 4 5 6 7 9 8 11 10
思路:很明显的全排列问题,如果要自己写的,则需要用到DFS,很麻烦。直接使用STL库中函数bool next_permutation(BidirectionalIterator _First, BidirectionalIterator _Last )
,生成下一个全排列(递增顺序)。
还有一个函数bool prev_permutation(BidirectionalIterator _First, BidirectionalIterator _Last )
,也是生成下一个全排列(递减顺序)。
AC代码
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n = 0, m = 0;
while (cin >> n >> m) {
int* a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = i + 1;
}
// 这里注意是m小,自己本身是第一小
for (int i = 0; i < m - 1; i++){
next_permutation(a, a + n);
}
for (int i = 0; i < n; i++) {
if (i != 0) {
cout << " ";
}
cout << a[i];
}
cout << endl;
}
return 0;
}