题目大意:给出一个数n,问对[1,2n]内的数,将他们两两配对,使得这n对数中每对的和都是连续的
1<=n<=1e5
思路:当n是偶数时,设n个数对每对的和分别为k+k+1+..+k+n-1;所有数的和等于(2k+n-1)*n/2,同时1到2n的所有数的和=n*(2n+1),用等号连接可得4n+2=2k+n-1,显然等号左边为偶数,等号右边为奇数,矛盾,所以无法构成和为连续的数对
当n是奇数时,设所有数的和为s,那么各个数对的和就应该为s/n-n/2...s/n-1/,s/n,s/n+1...s/n+n/2
比如n=5时,各个数对的和就等于9,10,11,12,13,那么我们先令第一个数对为(1,8)因为之后的数对两数之和+1,所以我们让数对中第一个数+2,第二个数-1,第二、三个数对为(3,7)(5,6),小于等于n的奇数都用完后,下一个数就由2构成,即(2,10)然后继续第一个数+2,第二个数-1的过程,得到(4,9)
//#include<__msvc_all_public_headers.hpp>
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 5;
typedef long long ll;
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--)
{
ll n;
cin >> n;
if (n & 1)
{
cout << "YES" << endl;
ll b = 2 * n - n / 2;//s/n-n/2-1
ll a = 1;
for (int i = 1; i <= (n + 1) / 2; i++)
{//遍历n范围内的所有奇数,构成第1个到中间的数对
cout << a << " " << b << endl;
a += 2;
b--;
}
a = 2, b = 2 * n;//2和s/n+1-2
for (int i = 1; i <= n / 2; i++)
{//遍历n范围内所有偶数
cout << a << " " << b << endl;
a += 2;
b--;
}
}
else
{
cout << "NO" << endl;
}
}
return 0;
}