hdu 5916 Harmonic Value Description 2016ACM/CCPC长春赛区现场赛F

本文介绍了一种算法,用于找出所有n元素排列中,和谐值为第k小的排列。和谐值定义为排列中相邻元素的最大公约数之和。通过构造特定序列并填充剩余数值,最终输出目标排列。

Problem Description
The harmonic value of the permutation p1,p2,pn is
i=1n1gcd(pi.pi+1)

Mr. Frog is wondering about the permutation whose harmonic value is the strictly k-th smallest among all the permutations of [n].
 

Input
The first line contains only one integer T (1T100), which indicates the number of test cases.

For each test case, there is only one line describing the given integers n and k (12kn10000).
 

Output
For each test case, output one line “Case #x: p1 p2  pn”, where x is the case number (starting from 1) and p1 p2  pn is the answer.
 

Sample Input
2 4 1 4 2
 

Sample Output
Case #1: 4 1 3 2 Case #2: 2 4 1 3

观察k的范围,2k<=n,因此只需要1和2的gcd求和就可以构造出第k小的数列

构造2,4,……2k,1,3,……,n的数列即可

其中后面部分顺次放入前面未使用过的数

#include<cstdio>
#include<string>
#include<cstring> 
using namespace std;
bool v[10001];
int q[10001];
int main()
{
	int T,kk=0;
	scanf("%d",&T);
	while(T>0)
	{
		T--;
		kk++;
		int n,k;
		scanf("%d%d",&n,&k);
		memset(v,false,sizeof(v));
		v[2]=true;
		int l=1,r=1,i;
		q[r]=2;
		for(i=2;i<=k;i++)
		{
			r++;
			q[r]=i*2;
			v[i*2]=true;
		}
		for(i=1;i<=n;i++)
		{
			if(!v[i])
			{
				r++;
				q[r]=i;
				v[i]=true;
			}
		}
		printf("Case #%d:",kk);
		for(i=1;i<=r;i++)
			printf(" %d",q[i]);
		printf("\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值