CF1788C Matching Numbers

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=2n 和另一项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=2n1 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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值