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

来源:互联网 发布:javascript实例大全 编辑:程序博客网 时间:2024/06/05 04:21

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;}

阅读全文
0 0
原创粉丝点击