注意分组
先判断第一个是1/2/3.。。。,在判断下一个,每组有多少个的判断方法
通过数组标记元素是否输出过
数组初始化方法
#include <iostream>
#include <vector>
using namespace std;
void getG(int g[]) {
for (int i = 2; i <= 20; ++i) {
g[i] = g[i - 1] * (i - 1) + 1;
}
return;
}
int main() {
int n, m;
int g[21];
g[1] = 1;
getG(g);
int i, j, k;
int co[21] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
while (cin >> n >> m) {
vector<int> outN(co, co + n + 1);
vector<int> ifU(21, 0);
i = n;
int whi = (m - 1 ) / g[n] + 1;
cout << whi;
ifU[whi] = 1;
whi = (m - 1) % g[n];
while (whi) {
i -= 1;
cout << " ";
int bwhi = (whi - 1) / g[i] + 1;
k = bwhi;
int j = 1;
for (j = 1;; ++j) {
if (ifU[j] == 0)
--k;
if (k == 0)
break;
}
cout << outN[j];
ifU[j] = 1;
whi = (whi - 1) % g[i];
}
cout << endl;
}
return 0;
}