1788C Matching Numbers
瞎搞找规律构造
首先用等差数列求出最小项
3
∗
(
n
+
1
)
/
2
3*(n+1)/2
3∗(n+1)/2
对于n为偶数 不能被整除 输出NO
对于n为奇数 从最大项往最小项构造,最大项由
x
=
2
∗
n
x=2*n
x=2∗n 和另一项y构成
然后不断使
x
−
=
2
x-=2
x−=2 ,另一项
y
+
=
1
y+=1
y+=1,直到
x
<
=
y
x<=y
x<=y 时停止
然后再由
x
=
2
n
−
1
x=2n-1
x=2n−1 和
y
y
y 继续构造即可
#include <bits/stdc++.h>
#define ll long long
using namespace std;
void solve(){
int n;
cin>>n;
if (n%2==0){
cout<<"NO\n";
return;
}
cout<<"YES\n";
int pos=n;
int x=2*n,y=3*(n+1)/2+n-1-x;
while (x>y){
cout<<x<<" "<<y<<"\n";
x-=2,y++;
pos--;
}
x=2*n-1;
y=3*(n+1)/2+pos-1-x;
while (pos){
cout<<x<<" "<<y<<"\n";
x-=2,y++;
pos--;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while (t--){
solve();
}
return 0;
}