刚开始看的时候,完全懵逼,真的不知道在说什么。突然感觉到英语牛逼的重要性,然后借助翻译,还是没懂。。

最后只好在CSDN上漫漫闲逛,最后在众多Blog的教导之下,渐渐明白了大意,却始终不知道原理。

本题主要是借助大佬的思路了,一贯钻牛角尖的我也放弃了。

其实我也不太清楚这思路到底咋来的,先贴下大佬的巨作膜拜,等学识再多点回头看看也许就能懂了

先码了

https://blog.csdn.net/lianqi15571/article/details/887701

#include<stdio.h>
#include<string.h>
long long g[21];
int a[21];
void set(){
	int i;
	g[1] = 1;
	for(i = 2; i < 21; i++)
		g[i] = g[i-1]*(i-1)+1;
}
int main()
{
	int n, i, t = 0;
	long long m;
	set();
	while(scanf("%d%lld",&n, &m) != EOF){
		memset(a, 0, sizeof(a));
		for(i = 1; i <= n; i++)
			a[i] = i;//每次处理前,都要重新改好a[i] 
			
		while(n>0 && m>0){
			t = m/g[n]+(m%g[n] > 0 ? 1 : 0); //求出该数在第几位 
			if(t > 0){ 
				printf("%d", a[t]);
				m = m - ((t-1)*g[n] + 1);//第一次输出数字后所求在新排列中的位置 
				for(i = t; i < n; i++)
					a[i] = a[i+1];//删除已输出的数字 
				putchar(m == 0 ? '\n' : ' ');
			}
			n--; // 表示最多允许输出n位数字 
		}
	}
	return 0;
}

慢慢理解,感觉还行