您的位置:首页 > 产品设计 > UI/UE

2016 ACM-ICPC Asia Regional Changchun 1006 Harmonic Value Description(逻辑思维)

2017-09-12 22:22 357 查看
Harmonic Value Description

题意:1~n的全排列中谐波值严格第k小的排列为多少,排列p1,p2,…,pn的谐波值定义为:


由于p1,p2,…,pn是1~n全排列中的一种,可想而知的是,严格第1小的排列必定是那种任意相邻两个数最大公约数为1的排列。例如排列1,2,3,…,n。

此外,1~n这n个数还是很奇妙的,我们可以构造出任意约数为k的对。当然,前提是k<=n/2,而题目的要求正好是2k<=n。

故谐波值严格第k小的排列可以是存在一对相邻两个数最大公约数为k,其余任意相邻两个数最大公约数为1的排列。

故最方便的构造方法(与样例输出不同,但两者谐波值时一样的)是将2k和k提取出来放在排列最前面,然后构造相邻两数最大公约数为1的排列

即下述这种排列:

2k,k,k-1,k-2,…,2,1,k+1,k+2,…,2k-1,2k+1,…,n-1,n

这么做的原因如下:

⑴gcd(k,2k)=k

⑵自然数中相邻两数的最大公约数为1

⑶自然数中相邻两奇数的最大公约数为1,即gcd(2k-1,2k+1)=1

⑷1与任何数的最大公约数为1

时间复杂度:O(n)

代码:

#include <stdio.h>

int main()
{
int t,n,k,i,p=1;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
printf("Case #%d:",p++);
printf(" %d %d",2*k,k);
for(i=k-1;i>=1;i--)
printf(" %d",i);
for(i=k+1;i<=n;i++)
if(i!=2*k)
printf(" %d",i);
putchar('\n');
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐