题意:
给定一个n,将1-2n之间所有的数每两个组成一对加和成为一个新的数,满足组成后的n个数满足排好序后任意相邻两个数之间都相差1。
分析:
首先,设最后组成的n个数的数组为[k,k+1,k+2,...,k+n-1],新的数组之和与之前1-2n的和相等,可以由等差数列得出等式:n(1+2n)=n(n+2k-1)/2,解得k=(3+3n)/2,然后输出时找规律,可以第一组输出(1,k-1),要满足单调递增,可以每次第一个数加2,第二个数减一,遍历玩小于n的所有奇数,再从第一个数从偶数2开始,第二个数从最大数2n开始,即(2,2n),和上面一样,每次第一个数加一,第二个数减一,就能得到答案。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
void solve()
{
ll n;
cin>>n;
if(n%2==0) cout<<"No"<<'\n';
else
{
cout<<"Yes"<<'\n';
ll cnt=(3+3*n)/2-1;
for(ll i=1;i<=n;i+=2) cout<<i<<' '<<cnt--<<'\n';
cnt=2*n;
for(ll i=2;i<=n;i+=2) cout<<i<<' '<<cnt--<<'\n';
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T;
cin>>T;
while(T--)
{
solve();
}
return 0;
}