题意

构造一个 的排列,使得相邻两个数异或起来是质数。

思路

爆搜。

实现

#include<bits/stdc++.h>
#define up(a,b,c)for(int a=b;a<=c;++a)
#define dn(a,b,c)for(int a=b;a>=c;--a)
const int N=22e5;
using namespace std;
int T,n,np[N];
vector<int>qwq,ans;
bool dfs(){
        if(qwq.empty())return 1;
        int sz=int(qwq.size());
        dn(i,int(qwq.size())-1,0){
                if(ans.empty()||!np[ans.back()^qwq[i]]){
                        int x=qwq[i];
                        qwq.erase(qwq.begin()+i),ans.push_back(x);
                        if(dfs())return 1;
                        qwq.insert(qwq.begin()+i,x),ans.pop_back();
                }
        }
        return 0;
}
int main(){
        cin.tie(0)->sync_with_stdio(0);
        cin>>T;
        while(T--){
                cin>>n;
                np[1]=1;
                up(i,1,n*2)
                        if(!np[i])
                                up(j,2,n*2/i)
                                        np[i*j]=1;
                qwq.clear(),ans.clear();
                up(i,0,n-1)qwq.push_back(i);
                if(dfs()){
                        up(i,0,n-1)cout<<ans[i]<<' ';cout<<'\n';
                }else cout<<"-1\n";
        }
        return 0;
}