首页 > 其他分享 >Codeforces Round 867 (Div. 3)-D. Super-Permutation

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

时间:2025-01-15 22:32:16浏览次数:1  
标签:dots bmod Permutation Codeforces 867 length permutation test

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 \(b_i = (a_1 + a_2 +~\dots~+ a_i) \bmod n\).

A permutation of numbers \([a_1, a_2, \dots, a_n]\) is called a super-permutation if \([b_1 + 1, b_2 + 1, \dots, b_n + 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\) (\(1 \le t \le 10^4\)) — the number of test cases. The description of the test cases follows.

Each test case consists of a single line containing one integer \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — the length of the desired(希望实现的) permutation.

The sum of \(n\) over all test cases does not exceed \(2 \cdot 10^5\).

输出格式

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
其中\(b_{i} = (a_{1} + a_2 + \dots + a_i)\bmod n\)
使得数组B和数组A均为1~n的全排列

输入

4
1
2
3
6

输出

1
2 1
-1
6 5 2 3 4 1

解题思路

1

\[b_{i} = (a_{1} + a_2 + \dots + a_i)\bmod n \tag{1} (i \geq 2) \]

\[b_{i - 1} = (a_{1} + a_2 + \dots + a_{i - 1})\bmod n \tag{2}(i \geq 2) \]

由\((1)-(2)\)可得,

\[b_{i} = (b_{i - 1} + a_{i}) \bmod n \]

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

\[b_k = (b_{k - 1} + a_k) \bmod n = (b_{k - 1} + n) \bmod n = b_{k - 1} \]

\[b_k = b_{k - 1} \]

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

\[a_1=n \]

\[b_1 = 0 \]

2

如果\(n\)为奇数,

\[b_{n} = (a_{1} + a_{2} + \dots + a_{n}) \bmod n \]

\[b_{n} = (1 + 2 + \dots + n) \bmod m = \frac{n(n+1)}{2} \bmod n = 0 = b_1 \]

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

3

当n为偶数时,

\[a = [n,~1,~n-2,~3,~n-4,~5,~\dots,~n - 1,~2] \]

对应的

\[b = [0,~1,~n-1,~2,~n-2,~3,~n-3,~\dots,~\frac{n}{2}] \]

代码实现

#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;
}

标签:dots,bmod,Permutation,Codeforces,867,length,permutation,test
From: https://www.cnblogs.com/matinalcosmos/p/18673837

相关文章

  • Codeforces 1536B Prinzessin der Verurteilung 题解 [ 紫 ] [ 后缀自动机 ] [ 动态规
    PrinzessinderVerurteilung:最短未出现字符串的板子。思路考虑在SAM上dp,定义\(dp_i\)表示从\(i\)节点走到NULL节点所花费的最少步数。显然我们建出反图,跑DAG上dp即可。转移如下:\[dp_i=1+\min_{j=1}^{|v_i|}dp_{v_{i,j}}\]输出方案的话记录下每个dp值的先驱,最......
  • VP Codeforces Round 978 (Div. 2)
    A.BustoPénjamo题意:有n个家庭,每个家庭有\(a_i\)个人,现在有r排座位,每个座位可以坐两个人。如果一个人自己一个坐一个座位或者和自己家庭的人坐一个座位,他就会开心,问所有人都入座后最多有多少人开心。我们肯定尽量让一个座位坐两个同一家庭的人,这样一个座位可以让两个人开心。......
  • Codeforces Round 992 (Div. 2) C题解析
    CodeforcesRound992(Div.2) C题解析题目描述......
  • VP Educational Codeforces Round 159 (Rated for Div. 2)
    A.BinaryImbalance题意:给你一个01串,每次选一个01或者一个10在他们中间插一个0进去,问能不能让0的个数大于1。我们进行一次插入操作后,显然还可以继续操作,所以只要有0和1就一定可以。注意特判全0的情况。点击查看代码voidsolve(){ intn; std::cin>>n; std::s......
  • Codeforces Round 996 (Div. 2) (A - C)
    A题链接:https://codeforces.com/contest/2055/problem/a题意:两个人Alice和Bob初始位置分别位a,b,n为长度大小,Alice先手选择一个方向前进,两人位置不重叠且一次走一格,谁不能走谁输解题思路:看他们两个谁先不能朝着对方位置前进,即为输voidsmoking(){  intn,a,b;  ......
  • Codeforces Round 734 (Div. 3) 题解
    建议开题顺序:A,B1,B2,C,E,F,D1,D2。A.PolycarpandCoins记\(k=\min(c1,c2)\),则\((c1-k)\times1+(c2-k)\times2+k\times3=n\)。注意到\(n\mod3\)为\(0,1,2\)。所以我们\(|c1-c2|\)最多为\(1\),只需要将\(n\mod3\)给\(1\)或\(2\)即可。B1.WonderfulColo......
  • vp Codeforces Round 986 (Div. 2)
    A.Alice'sAdventuresin"Chess"题意:你从(0,0)出发,重复固定的移动路径,问能不能经过(a,b)。直接跑一百次就行,因为ab都很小(其实只要跑20次)。点击查看代码voidsolve(){intn,a,b;std::cin>>n>>a>>b;intx=0,y=0;std::strings;std:......
  • cf-800 a b c:https://codeforces.com/contest/1694
    cf-800链接:https://codeforces.com/contest/1694题a正常循环输入01,多的最后输入就行你要的代码在这里usingnamespacestd;typedeflonglongll;intmain(){intu;cin>>u;while(u--){inta,b;cin>>a>>b;into=abs(a-b);......
  • 【区间合并+贡献法】codeforces 1789 C. Serval and Toxel's Arrays
    题目https://codeforces.com/problemset/problem/1789/C题意第一行输入一个正整数\(T(1\leqT\leq10^4)\),代表\(T\)组测试用例。对于每组测试用例:第一行输入两个正整数\(n,m(1\leqn,m\leq2\times10^5)\),分别代表要输入的数组长度和修改次数。第二行输入一个长......
  • VP Codeforces Round 995 (Div. 3)
    A.PreparingfortheOlympiad题意,有两个数组a和b,如果你选了a数组中第i个,那么对手获得b数组第i+1个,求你们得分的差值最大。直接加上所有ai>bi+1的就行。点击查看代码voidsolve(){intn;std::cin>>n;std::vector<int>a(n),b(n);for(inti=0;......