刚开始看的时候,完全懵逼,真的不知道在说什么。突然感觉到英语牛逼的重要性,然后借助翻译,还是没懂。。
最后只好在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;
}
慢慢理解,感觉还行