CodeforcesOctober 26, 2025

CodeForces Rating 900-1000 题解

该文章为整理的CodeForces Rating 在 900-1000 区间的题单的题解。

CodeForcesansc++Rating 900-1000

Rating 900

2137B 有趣的数列

来源:CodeForces Round 1047 (Div. 3)-B. Fun Permutation

Tags: 构造算法 数学 数论

时间限制内存限制
2 秒256 megabytes

中文题面可在本博客的cf题单中查看: 本题链接

根据题目可知,给定一个大小为 nn 的排列 pp。找到一个大小为 nn 的排列 qq,使得对于所有 1i<n1 \leq i<n,满足 GCD\operatorname{GCD} (pi+qi,pi+1+qi+1)3(p_i+q_i, p_{i+1}+q_{i+1}) \geq 3

那么,我们假设存在一个大小为 nn 的排列 qq。使得 GCD\operatorname{GCD} (pi+qi,pi+1+qi+1)3(p_i+q_i, p_{i+1}+q_{i+1}) \geq 3

由输入的 nn 的范围可知,n2\forall n \geq 2 。于是,我们尝试构建一个数列 qq ,使得 qq 的元素与 pp 的元素之和的 GCD\operatorname{GCD} 值等于 n+1n+1 ∗Tip:GCD(n+1,n+1)=n+13^{\text{∗Tip:}} \operatorname{GCD}(n+1,n+1)=n+1\geq 3。又因为数列 pp 是一个排列,所以 qq 也是一个排列,于是有 pi+qi=n+1p_i+q_i=n+1 ,所以 qi=npi+1q_i=n-p_i+1

所以题解为:

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
using namespace std;

void solve() {
    ll n;
    cin >> n;
    vector<ll> a(n);
    for (ll i=0;i<n;i++) {
        cin>>a[i];
        if (i>0) cout<<" ";
        cout<<n-a[i]+1;
    }
    cout<<endl;
}

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    ll t;
    cin >> t;
    while(t--) {
        solve();
    }
    return 0;
}

Last updated on