题目概述
一个数列由1到N的N个自然数构成,求其按字典序第M小的排列
时限
1000ms/2000ms
输入
每行两个正整数N,M,输入到EOF为止
限制
1<=N<=1000;1<=M<=10000
输出
每行N个数,为所求的数列,两个数之间有一个空格
样例输入
6 4
11 8
样例输出
1 2 3 5 6 4
1 2 3 4 5 6 7 9 8 11 10
讨论
排列组合,再碰上个水的要命的数据,第一想法就是交给stl解决,那就是看对stl的熟练度了,没什么难度了
顺便一提,这个题考察的原本知识点是康托展开的逆运算
题解状态
46MS,1716K,660B,C++
题解代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 1003
#define memset0(a) memset(a,0,sizeof(a))
int N, M;
int nums[MAXN];
bool f;//控制数间空格输出
void fun()
{
for (int p = 1; p <= N; p++)
nums[p - 1] = p;
for (int p = 0; p < M - 1; p++)
next_permutation(nums, nums + N);//求按字典序下一个全排列
for (int p = 0; p < N; p++) {
if (f)
printf(" ");//output
printf("%d", nums[p]);//output
f = 1;
}
printf("\n");//output
}
int main(void)
{
//freopen("vs_cin.txt", "r", stdin);
//freopen("vs_cout.txt", "w", stdout);
while (~scanf("%d%d", &N, &M)) {//input
fun();
f = 0;
memset0(nums);
}
}
EOF