CCPC2016长春F (hdu 5916 Harmonic Value Description)

Posted lmissher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCPC2016长春F (hdu 5916 Harmonic Value Description)相关的知识,希望对你有一定的参考价值。

构造一个n个数字的排列,使其作为 sigma( gcd( a[i] , a[i+1] ) ) 中第k小的排列。

因为题目给的 k*2 <= n ,所以可以知道只会询问最小到第 n/2 小,易得最多移动一个数字即可得到答案。

假设原始排列为1 2 3 ... n,如果询问最小直接输出排列,否则询问x且x是偶数就把x移动到2*n与2*n-1之间。

如果x是奇数就将x与 2*n-1或者2*n+1交换。因为有可能2*n-1和2*n+1与x-1或者x+1不互质。

 

 

 

技术分享图片
//#define test
#include<bits/stdc++.h>
using namespace std;
const int Nmax=1e6+7;
typedef long long ll;
int a[Nmax];
int n,m;
int main()
{
#ifdef test
#endif
    int t;
    //freopen("f.in","r",stdin);
    scanf("%d",&t);

    for(int cases=1; cases<=t; cases++)
    {
        printf("Case #%d:",cases);

        scanf("%d%d",&n,&m);

        //printf("n:%d m:%d
",n,m);
        for(int i=1; i<=n; i++)
            a[i]=i;

        if(m&1)
        {
            int l=m-1,r=m+1;

            if((m!=l && __gcd(2*m-1,l) !=1) || (m != r && __gcd(2*m-1,r)!=1))
                swap(a[m],a[2*m+1]);
            else
                swap(a[m],a[2*m-1]);
        }
        else
        {

            a[2*m]=m;

            for(int i=2*m+1; i<=n+1; i++)
                a[i]=i-1;

            for(int i=m; i<=n; i++)
                a[i]=a[i+1];
        }

        for(int i=1; i<=n; i++)
            printf(" %d",a[i]);

        printf("
");
     

    }

    return 0;
}
View Code

 

以上是关于CCPC2016长春F (hdu 5916 Harmonic Value Description)的主要内容,如果未能解决你的问题,请参考以下文章

CCPC2016长春B (hdu 5912 Fraction)

CCPC2016长春D (hdu 5914 Triangle)

HDU 5918 SequenceI (2016 CCPC长春站 KMP模版变形)

HDU 5919 - Sequence II (2016CCPC长春) 主席树 (区间第K小+区间不同值个数)

组队训练2016 CCPC 长春

2016 CCPC 长春 Solution