hdu5916
题目
给两个数n,k(1<= k < 2*k <=n),然你构造一组1-n数列,使得相邻两数gcd的和为所有排列可能中的第k小个排列
思路
相邻的互质,不动的话就是k=1,所以把偶数凑一起,凑几个就是第几小,把它们放到1与2之间。
代码
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
int vis[10010];
int main()
{
int T;
scanf("%d",&T);
int kase=1;
while(T--)
{
memset(vis,0,sizeof(vis));
printf("Case #%d: ",kase++);
int n,k;
scanf("%d %d",&n,&k);
k--;
int e=n%2==0?n:n-1;
int flag=0;
for(int i=1; i<=n&&k!=-1; i++)
{
if(i%2==1)
{
if(flag==0)
{
printf("%d",i);
vis[i]=1;
flag=1;
}
else
{
printf(" %d",i);
vis[i]=1;
}
}
else
{
while(k--){
printf(" %d",e);
vis[e]=1;
e-=2;
}
printf(" %d",i);
vis[i]=1;
}
}
for(int i=1; i<=n; i++)
if(!vis[i])
{
if(flag==0)
{
printf("%d",i);
flag=1;
}
else
printf(" %d",i);
}
printf("\n");
}
return 0;
}