题意:运用一个性质,位运算的结果只与同一位有关
要我们构造出k,分为两种情况
1.k<=n-2
由于n-1是一个全为1的奇数,n-1与任何数相与都是这个数本身,所以要求这个数k的时候,只要让k和n-1配对,就可以了
2.k==n-1
这个情况比较复杂,我们知道只需要输出其中一种解决方案即可,n-1是一位全为1的奇数,可以拆开看为n-2(仅最后一个为0,其他位==1) + 1
那么我们要确保n-2能被输出,就只有n-1和他配对,然后1能被输出,最简单的就是1和2配对
对于不能输出的情况,打表发现,只有4,3一种情况
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N=1e5+10;
int a[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
int tar=n-1;
for(int i=0;i<n/2;i++)
{
a[i]=i;
a[i+n/2]=tar^i;
}
if(n==4&&k==3){
cout<<-1<<'\n';continue;
}
if(k==n-1)
{
}
if(k<=n-2)
{
swap(a[n-1],a[k-1]);
}
cout<<"there:";
for(int i=0;i<n/2;i++)
cout<<a[i]<<' '<<a[i+n/2]<<'\n';
cout<<endl;
}
}
/*
0-7
110
111
000
010
001
101
011
100
*/