题目
#include<bits/stdc++.h>
using namespace std;
// int n;
// bool vis[100];
// int a[100];
// bool isprime(int x){
// if(x <= 2) return 0;
// for(int i = 2; i * i <= x; i++){
// if(x % i == 0) return 0;
// }
// return 1;
// }
// void dfs(int u){
// if(u == n + 1){
// for(int i = 1; i <= n; i++){
// cout << a[i] << ' ';
// }
// cout << '\n';
// }
// for(int i = 1; i <= n; i++){
// if(vis[i]) continue;
// if(u == 1){
// if(!isprime(i)) continue;
// }
// else{
// if(!isprime(abs(i - a[u - 1]))) continue;
// }
// vis[i] = 1;
// a[u] = i;
// dfs(u + 1);
// vis[i] = 0;
// }
// }
int a[9][9] = {
{0},
{1},
{1, 2},
{1, 2, 3},
{1, 2, 3, 4},
{1, 4, 3, 2, 5},
{1, 4, 3, 2, 5, 6},
{1, 4, 3, 2, 5, 6, 7},
{3, 6, 1, 4, 7, 2, 5, 8}
};
void solve(){
int n, i, j;
cin >> n;
int r = n % 8;
for(i = 0; i < r; i++){
cout << a[r][i] << ' ';
}
int q = n / 8;
for(i = 1; i <= q; i++){
for(j = 0; j < 8; j++){
cout << a[8][j] + r + (i - 1) * 8 << ' ';
}
}
cout << '\n';
}
int main(){
// for(int i = 3; i <= 10; i++){
// n = i;
// dfs(1);
// }
//打表,找到一个排列,满足第一个数是质数,最后一个数是排列的最大值,相邻两个数只差为质数
//那么,就能以这个排列的长度为一个周期,构造为长度为n的满足条件的排列(如果n不是8的倍数,设余数为r,
//就要在前面补一个长度为r的排列,满足最后一个数最大,相邻两个数的和或差为
ios::sync_with_stdio(0);
cin.tie(0);
int T;
cin >> T;
while(T--){
solve();
}
return 0;
}