/*
HDU - 5916
题目大意是
先给了一个概念,
对于一个数组相邻两位的最大公约数的和,被称为谐波值。
然后给你一个n一个k,
要你求由1到n组成的数列中,
谐波值第k小的数列。
很明显有多个符合要求的数列,我们找到一个即可。
所以我们找一个最好找的。
如果一个数列是1到n按顺序排序的,
那么它两两的最大公约数一定是1,
所以它的谐波值为n-1,这也是第一小的。
假设我们现在要找的是第二小的,
那么找到一个谐波值为n的即可。
现在我们要找的是第k小的,
所以找到一个谐波值为n-1+k-1的即可
也就是说,我们找到一个数组,
使某两个数的最大公约数为k,
其他的依旧为1即可。
(如果把k的那个看成k-1和1,那么这个1加上其他的1就是n-1)
然后我们根据题目给的范围提示,就想到2*k
我们把2*k放到第一个k放到第二个,然后使剩下的只依次排下来就行
注意:
后面部分不能写成我注释掉的那样,
那段代码不符合k为奇数的情况。
*/
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <string.h>
#define ll long long
using namespace std;
int main()
{
int t;
cin>>t;
for(int s=1; s<=t; s++)
{
printf("Case #%d: ",s);
int n,k;
cin>>n>>k;
cout<<2*k<<' '<<k;
// for(int i=1; i<=n; i++)
// {
// if(i==k||i==2*k)
// continue;
// cout<<' '<<i;
// }
for(int i=k-1;i>=1;i--)
cout<<' '<<i;
for(int i=k+1;i<=2*k-1;i++)
cout<<' '<<i;
for(int i=2*k+1;i<=n;i++)
cout<<' '<<i;
cout<<endl;
}
return 0;
}
HDU - 5916
题目大意是
先给了一个概念,
对于一个数组相邻两位的最大公约数的和,被称为谐波值。
然后给你一个n一个k,
要你求由1到n组成的数列中,
谐波值第k小的数列。
很明显有多个符合要求的数列,我们找到一个即可。
所以我们找一个最好找的。
如果一个数列是1到n按顺序排序的,
那么它两两的最大公约数一定是1,
所以它的谐波值为n-1,这也是第一小的。
假设我们现在要找的是第二小的,
那么找到一个谐波值为n的即可。
现在我们要找的是第k小的,
所以找到一个谐波值为n-1+k-1的即可
也就是说,我们找到一个数组,
使某两个数的最大公约数为k,
其他的依旧为1即可。
(如果把k的那个看成k-1和1,那么这个1加上其他的1就是n-1)
然后我们根据题目给的范围提示,就想到2*k
我们把2*k放到第一个k放到第二个,然后使剩下的只依次排下来就行
注意:
后面部分不能写成我注释掉的那样,
那段代码不符合k为奇数的情况。
*/
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <string.h>
#define ll long long
using namespace std;
int main()
{
int t;
cin>>t;
for(int s=1; s<=t; s++)
{
printf("Case #%d: ",s);
int n,k;
cin>>n>>k;
cout<<2*k<<' '<<k;
// for(int i=1; i<=n; i++)
// {
// if(i==k||i==2*k)
// continue;
// cout<<' '<<i;
// }
for(int i=k-1;i>=1;i--)
cout<<' '<<i;
for(int i=k+1;i<=2*k-1;i++)
cout<<' '<<i;
for(int i=2*k+1;i<=n;i++)
cout<<' '<<i;
cout<<endl;
}
return 0;
}