Problem Description
The harmonic value of the permutation p1,p2,⋯pn is
Mr. Frog is wondering about the permutation whose harmonic value is the strictly k-th smallest among all the permutations of [n].
∑i=1n−1gcd(pi.pi+1)
Mr. Frog is wondering about the permutation whose harmonic value is the strictly k-th smallest among all the permutations of [n].
Input
The first line contains only one integer T (1≤T≤100),
which indicates the number of test cases.
For each test case, there is only one line describing the given integers n and k (1≤2k≤n≤10000).
For each test case, there is only one line describing the given integers n and k (1≤2k≤n≤10000).
Output
For each test case, output one line “Case #x: p1 p2 ⋯ pn”,
where x is the case number (starting from 1) and p1 p2 ⋯ pn is
the answer.
Sample Input
2 4 1 4 2
Sample Output
Case #1: 4 1 3 2 Case #2: 2 4 1 3
观察k的范围,2k<=n,因此只需要1和2的gcd求和就可以构造出第k小的数列
构造2,4,……2k,1,3,……,n的数列即可
其中后面部分顺次放入前面未使用过的数
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
bool v[10001];
int q[10001];
int main()
{
int T,kk=0;
scanf("%d",&T);
while(T>0)
{
T--;
kk++;
int n,k;
scanf("%d%d",&n,&k);
memset(v,false,sizeof(v));
v[2]=true;
int l=1,r=1,i;
q[r]=2;
for(i=2;i<=k;i++)
{
r++;
q[r]=i*2;
v[i*2]=true;
}
for(i=1;i<=n;i++)
{
if(!v[i])
{
r++;
q[r]=i;
v[i]=true;
}
}
printf("Case #%d:",kk);
for(i=1;i<=r;i++)
printf(" %d",q[i]);
printf("\n");
}
return 0;
}