HDU2062按字典序输出m

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

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

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

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

先码了

https://blog.youkuaiyun.com/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;
}

慢慢理解,感觉还行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值