Loading web-font TeX/Math/Italic

Codeforces Round 867 (Div. 3)-D. Super-Permutation

Codeforces 题解 - [Codeforces Round 867 (Div. 3)-D. Super-Permutation]

题目链接

题目描述

A permutation is a sequence n integers, where each integer from 1 to n appears exactly once. For example, [1], [3,5,2,1,4], [1,3,2] are permutations, while [2,3,2], [4,3,1], [0] are not.

Given a permutation a, we construct(构造) an array b, where bi=(a1+a2+  +ai)modn.

A permutation of numbers [a1,a2,,an] is called a super-permutation if [b1+1,b2+1,,bn+1] is also a permutation of length n.

Grisha became interested whether a super-permutation of length n exists. Help him solve this non-trivial(重要的) problem. Output any super-permutation of length n, if it exists. Otherwise(不然), output 1.

输入格式

The first line contains a single integer t (1t104) — the number of test cases. The description of the test cases follows.

Each test case consists of a single line containing one integer n (1n2105) — the length of the desired(希望实现的) permutation.

The sum of n over all test cases does not exceed 2105.

输出格式

For each test case, output in a separate line:

  • n integers — a super-permutation of length n, if it exists.
  • 1, otherwise.

If there are several suitable permutations, output any of them.

题目大意

构造一个数组A
其中bi=(a1+a2++ai)modn
使得数组B和数组A均为1~n的全排列

输入

4
1
2
3
6

输出

1
2 1
-1
6 5 2 3 4 1

解题思路

1

bi=(a1+a2++ai)modn(i2)

bi1=(a1+a2++ai1)modn(i2)

(1)(2)可得,

bi=(bi1+ai)modn

让数字k代表数字n在a数组排列中的位置,即ak=n. 当k>1时,

bk=(bk1+ak)modn=(bk1+n)modn=bk1

bk=bk1

此时一定不是全排列。则k一定为1,即

a1=n

b1=0

2

如果n为奇数,

bn=(a1+a2++an)modn

bn=(1+2++n)modm=n(n+1)2modn=0=b1

此时也一定不会是全排列。因此n>1时只有n为偶数有可行方案

3

当n为偶数时,

a=[n, 1, n2, 3, n4, 5, , n1, 2]

对应的

b=[0, 1, n1, 2, n2, 3, n3, , n2]

代码实现

#include "bits/stdc++.h"
using namespace std;

void Solution()
{
    int n; cin >> n;
    if(n == 1) { cout << 1 << '\n'; return; }
    if (n & 1) { cout << -1 << '\n'; return; }

    for(int i = 1;i <= n;++i)
    {
        if(i & 1)
        {
            cout << n - i + 1 << ' ';
        }
        else
        {
            cout << i - 1 << ' ';
        }
    }
    cout << '\n';
    return;
}//Monotonous

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int t; cin >> t;
    while (t--)
    {
        Solution();
    }

    return 0;
}
posted @   MatinalCosmos  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示