D. Super-Permutation

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.

Input

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.

Output

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.

Example

input

4
1
2
3
6

output

1
2 1
-1
6 5 2 3 4 1

 

解题思路

  nmd思维构造题比赛结束了都没想出来怎么做,被搞到心态爆炸后面的题没都多少时间做了,后面所谓的“难题”都比这题要简单多了好吧。

  以后遇到这种题直接小数据打表找规律,想推导纯纯在浪费时间。

  打个表先,把10以内满足条件的排列都暴搜出来:

复制代码
#include <bits/stdc++.h>
using namespace std;

const int N = 20;

int p[N];
bool vis[N], st[N];

void dfs(int u, int s, int n) {
    if (u > n) {
        for (int i = 1; i <= n; i++) {
            printf("%d ", p[i]);
        }
        printf("\n");
        return;
    }
    for (int i = 1; i <= n; i++) {
        int t = (s + i) % n + 1;
        if (!vis[i] && !st[t]) {
            vis[i] = st[t] = true;
            p[u] = i;
            dfs(u + 1, t - 1, n);
            vis[i] = st[t] = false;
        }
    }
}

int main() {
    int n = 10;
    for (int i = 1; i <= n; i++) {
        printf("%d:\n", i);
        dfs(1, 0, i);
        printf("\n");
    }
    
    return 0;
}
打表代码
复制代码
复制代码
1:
1

2:
2 1

3:

4:
4 1 2 3
4 3 2 1

5:

6:
6 1 4 3 2 5
6 2 5 3 1 4
6 4 1 3 5 2
6 5 2 3 4 1

7:

8:
8 1 2 3 4 5 6 7
8 1 5 7 6 4 3 2
8 1 6 3 4 5 2 7
8 1 6 4 3 7 5 2
8 2 1 3 7 4 6 5
8 2 3 4 6 7 5 1
8 2 5 7 3 4 6 1
8 2 7 4 6 3 1 5
8 3 2 1 4 7 6 5
8 3 2 4 1 5 7 6
8 3 6 1 4 7 2 5
8 3 7 5 2 4 1 6
8 5 1 3 6 4 7 2
8 5 2 7 4 1 6 3
8 5 6 4 7 3 1 2
8 5 6 7 4 1 2 3
8 6 1 4 2 5 7 3
8 6 3 1 5 4 2 7
8 6 5 4 2 1 3 7
8 6 7 5 1 4 2 3
8 7 2 4 5 1 3 6
8 7 2 5 4 3 6 1
8 7 3 1 2 4 5 6
8 7 6 5 4 3 2 1

9:

10:
10 1 2 3 6 7 5 4 9 8
10 1 2 3 8 4 9 5 7 6
10 1 2 4 7 5 3 6 8 9
10 1 2 4 7 5 9 8 6 3
10 1 2 4 9 3 5 8 6 7
10 1 2 4 9 8 5 3 6 7
10 1 2 5 9 7 8 4 3 6
10 1 2 6 3 5 7 4 8 9
10 1 2 6 3 5 9 8 4 7
10 1 2 6 7 8 4 9 5 3
10 1 2 9 5 7 4 8 3 6
10 1 3 2 6 7 4 5 9 8
10 1 3 2 6 7 9 5 4 8
10 1 3 2 7 6 9 4 5 8
10 1 3 4 8 7 9 5 2 6
10 1 3 5 8 6 9 4 2 7
10 1 3 8 4 7 5 9 2 6
10 1 3 8 6 5 4 2 7 9
10 1 3 9 6 7 2 4 5 8
10 1 3 9 6 8 5 4 2 7
10 1 5 3 8 6 9 2 4 7
10 1 5 7 4 2 9 6 8 3
10 1 5 7 6 3 2 4 9 8
10 1 5 7 6 9 4 2 3 8
10 1 5 8 3 2 4 9 6 7
10 1 5 8 9 4 2 3 6 7
10 1 6 2 3 4 8 9 5 7
10 1 6 2 5 4 8 7 9 3
10 1 6 2 7 8 4 5 9 3
10 1 6 2 7 8 9 5 4 3
10 1 6 7 8 4 3 9 5 2
10 1 7 4 2 5 8 6 3 9
10 1 7 5 9 4 8 3 2 6
10 1 7 6 2 3 4 9 5 8
10 1 7 6 8 5 2 4 3 9
10 1 7 6 8 5 9 3 4 2
10 1 8 3 6 5 4 7 2 9
10 1 8 4 5 9 7 2 6 3
10 1 8 5 3 6 9 4 2 7
10 1 8 7 2 6 9 4 5 3
10 1 8 9 5 4 7 2 6 3
10 1 8 9 6 2 7 4 5 3
10 1 8 9 6 3 5 4 7 2
10 2 1 5 6 3 4 8 7 9
10 2 1 6 5 3 4 7 8 9
10 2 1 6 7 5 3 4 9 8
10 2 1 6 8 7 4 3 5 9
10 2 1 6 8 9 5 3 4 7
10 2 1 8 6 9 3 5 4 7
10 2 4 1 6 8 3 5 9 7
10 2 4 1 7 9 5 3 8 6
10 2 4 3 5 9 8 6 1 7
10 2 4 3 9 5 1 7 6 8
10 2 4 3 9 5 8 6 7 1
10 2 4 5 3 9 6 8 1 7
10 2 4 7 1 5 9 3 6 8
10 2 5 1 6 7 8 4 3 9
10 2 5 6 1 4 3 8 7 9
10 2 5 6 8 3 4 1 7 9
10 2 5 9 3 4 8 7 6 1
10 2 5 9 7 1 4 3 8 6
10 2 5 9 7 8 3 4 1 6
10 2 6 1 5 3 9 7 8 4
10 2 6 1 7 5 3 9 4 8
10 2 6 1 8 7 9 3 5 4
10 2 6 5 1 3 4 8 7 9
10 2 7 4 5 3 6 9 8 1
10 2 7 8 1 6 9 3 5 4
10 2 7 8 6 1 4 3 5 9
10 2 9 3 4 5 6 7 1 8
10 2 9 5 3 8 6 1 4 7
10 2 9 7 6 5 4 3 1 8
10 3 1 2 6 5 4 8 9 7
10 3 1 5 7 2 4 9 6 8
10 3 1 8 4 5 6 2 9 7
10 3 1 8 4 5 7 9 2 6
10 3 1 8 6 9 2 7 5 4
10 3 4 1 6 8 7 2 5 9
10 3 4 2 5 7 1 6 8 9
10 3 4 5 9 8 7 2 6 1
10 3 4 7 5 2 1 6 8 9
10 3 4 7 8 6 1 2 5 9
10 3 4 7 8 9 5 2 1 6
10 3 4 9 8 5 2 1 6 7
10 3 5 1 2 6 7 8 4 9
10 3 5 1 8 7 2 6 9 4
10 3 5 1 8 9 6 2 7 4
10 3 5 4 7 2 6 9 8 1
10 3 5 4 9 6 2 7 8 1
10 3 5 9 4 8 7 6 2 1
10 3 6 2 1 5 7 4 8 9
10 3 6 2 1 5 9 8 4 7
10 3 6 2 7 4 5 9 8 1
10 3 6 2 7 9 5 4 8 1
10 3 6 5 7 1 4 2 9 8
10 3 6 7 5 1 2 4 9 8
10 3 6 8 1 4 2 7 5 9
10 3 6 8 9 5 1 2 4 7
10 3 6 8 9 5 7 4 2 1
10 3 6 9 4 2 7 5 1 8
10 3 6 9 8 1 5 2 7 4
10 3 8 1 4 2 9 7 5 6
10 3 8 6 1 4 2 5 7 9
10 3 8 6 1 4 7 5 2 9
10 3 8 6 5 2 4 1 7 9
10 3 8 6 9 2 4 7 5 1
10 3 9 2 4 1 7 5 6 8
10 3 9 4 2 1 5 7 6 8
10 3 9 4 8 5 2 6 1 7
10 3 9 5 4 8 7 2 6 1
10 3 9 6 1 8 7 2 5 4
10 3 9 6 8 1 2 5 7 4
10 3 9 6 8 1 7 5 2 4
10 3 9 7 8 1 6 2 5 4
10 3 9 7 8 4 5 2 6 1
10 4 2 5 7 1 8 6 9 3
10 4 2 7 5 1 3 9 6 8
10 4 2 7 6 9 3 1 5 8
10 4 2 7 9 5 1 3 8 6
10 4 3 1 8 5 2 9 7 6
10 4 3 5 1 6 2 7 8 9
10 4 3 9 2 5 8 1 7 6
10 4 5 2 6 1 8 7 9 3
10 4 5 2 7 8 1 6 9 3
10 4 5 3 1 8 6 9 2 7
10 4 5 3 9 6 1 8 7 2
10 4 5 3 9 7 8 1 6 2
10 4 5 7 2 9 6 8 1 3
10 4 7 2 5 1 8 9 6 3
10 4 7 2 6 3 5 1 8 9
10 4 7 2 6 9 8 1 5 3
10 4 7 2 9 5 1 8 3 6
10 4 7 5 2 1 8 6 9 3
10 4 7 6 2 3 1 5 8 9
10 4 8 1 3 5 6 2 9 7
10 4 8 1 3 5 7 9 2 6
10 4 8 1 5 3 6 2 7 9
10 4 8 5 1 3 2 6 7 9
10 4 8 7 2 6 1 5 3 9
10 4 8 7 9 3 5 1 6 2
10 4 8 9 7 5 3 1 2 6
10 4 9 6 2 7 8 1 5 3
10 4 9 6 7 2 3 1 5 8
10 4 9 8 5 1 2 3 6 7
10 6 1 2 5 9 8 7 4 3
10 6 1 4 3 8 7 9 5 2
10 6 1 4 8 3 2 9 5 7
10 6 2 1 3 5 7 9 8 4
10 6 2 3 1 7 5 9 4 8
10 6 2 3 8 4 9 5 7 1
10 6 2 5 9 7 8 4 3 1
10 6 2 9 5 7 4 8 3 1
10 6 2 9 7 5 3 1 8 4
10 6 2 9 7 5 4 8 1 3
10 6 3 4 8 7 9 5 2 1
10 6 3 5 8 9 2 4 1 7
10 6 3 8 1 5 9 2 7 4
10 6 3 8 4 1 2 9 5 7
10 6 3 8 4 7 5 9 2 1
10 6 3 8 5 9 2 1 4 7
10 6 5 3 8 1 4 2 9 7
10 6 5 7 1 3 2 9 4 8
10 6 5 7 1 4 9 2 3 8
10 6 5 7 9 2 4 1 8 3
10 6 5 8 3 2 9 4 1 7
10 6 5 8 4 9 2 3 1 7
10 6 7 1 8 5 2 9 3 4
10 6 7 5 9 4 8 3 2 1
10 6 7 9 2 5 8 1 3 4
10 6 8 3 1 5 9 7 2 4
10 6 8 3 4 1 7 9 5 2
10 6 8 3 5 9 7 1 4 2
10 6 8 5 3 9 2 4 1 7
10 7 1 3 2 6 5 8 4 9
10 7 1 3 2 9 4 8 5 6
10 7 1 4 2 9 3 5 8 6
10 7 1 4 2 9 8 5 3 6
10 7 1 4 9 2 3 8 5 6
10 7 1 5 6 2 3 8 4 9
10 7 1 6 2 5 8 4 9 3
10 7 1 6 8 9 5 3 4 2
10 7 1 8 6 9 3 5 4 2
10 7 2 4 1 8 6 3 5 9
10 7 2 4 5 8 6 9 3 1
10 7 2 4 9 6 3 5 8 1
10 7 2 4 9 6 8 5 3 1
10 7 2 9 6 8 1 3 5 4
10 7 4 1 2 9 5 8 3 6
10 7 4 1 6 8 3 5 9 2
10 7 4 2 1 5 3 6 8 9
10 7 4 2 1 5 9 8 6 3
10 7 4 2 9 6 8 3 5 1
10 7 4 3 5 9 8 6 1 2
10 7 4 5 3 9 6 8 1 2
10 7 4 8 3 1 5 6 2 9
10 7 4 8 3 6 5 1 2 9
10 7 4 8 9 5 1 2 6 3
10 7 4 8 9 5 3 6 2 1
10 7 5 1 6 2 3 4 8 9
10 7 5 6 1 4 8 3 2 9
10 7 5 6 3 8 4 1 2 9
10 7 5 9 2 1 4 8 3 6
10 7 5 9 2 3 8 4 1 6
10 7 5 9 8 4 3 2 6 1
10 7 6 1 2 5 8 9 4 3
10 7 6 3 2 1 5 8 9 4
10 7 6 3 2 4 9 8 5 1
10 7 6 3 5 8 9 4 2 1
10 7 6 5 1 2 3 8 4 9
10 7 6 8 5 3 9 4 2 1
10 7 6 9 4 2 3 8 5 1
10 7 9 2 4 1 8 3 5 6
10 7 9 2 6 5 3 1 8 4
10 7 9 2 6 5 4 8 1 3
10 7 9 5 3 8 6 1 4 2
10 7 9 8 4 5 6 2 1 3
10 8 1 3 4 5 6 7 9 2
10 8 1 5 7 2 4 9 6 3
10 8 1 7 6 5 4 3 9 2
10 8 3 2 4 9 6 7 5 1
10 8 3 2 9 4 1 7 5 6
10 8 3 6 5 7 4 1 2 9
10 8 4 5 9 7 6 2 3 1
10 8 4 9 2 3 1 7 5 6
10 8 4 9 3 5 7 1 6 2
10 8 4 9 5 7 1 3 2 6
10 8 5 1 3 2 7 6 9 4
10 8 5 1 3 9 6 7 2 4
10 8 5 1 7 6 2 3 4 9
10 8 5 4 2 7 6 9 3 1
10 8 5 4 9 6 7 2 3 1
10 8 5 9 4 3 2 6 7 1
10 8 6 3 9 5 1 7 4 2
10 8 6 5 7 1 4 2 9 3
10 8 6 7 1 5 2 4 3 9
10 8 6 7 1 5 9 3 4 2
10 8 6 7 5 1 2 4 9 3
10 8 6 9 3 1 5 7 2 4
10 8 6 9 4 2 7 5 1 3
10 8 9 2 4 1 7 5 6 3
10 8 9 4 2 1 5 7 6 3
10 8 9 4 2 3 6 7 5 1
10 8 9 4 3 5 7 6 1 2
10 8 9 4 5 7 6 3 2 1
10 8 9 5 4 7 6 2 3 1
10 9 2 1 4 7 5 6 3 8
10 9 2 1 4 8 3 6 5 7
10 9 2 1 5 6 3 8 4 7
10 9 2 3 8 4 1 6 5 7
10 9 2 5 7 4 1 6 8 3
10 9 2 6 5 1 3 8 4 7
10 9 2 7 4 5 6 3 8 1
10 9 3 4 2 5 1 7 6 8
10 9 3 4 2 5 8 6 7 1
10 9 3 4 8 7 6 1 5 2
10 9 3 5 1 6 2 7 8 4
10 9 3 6 8 5 2 4 7 1
10 9 4 3 2 6 7 1 5 8
10 9 4 8 3 2 1 5 6 7
10 9 4 8 3 2 6 5 1 7
10 9 4 8 5 6 2 3 1 7
10 9 4 8 7 6 2 1 5 3
10 9 5 2 1 6 8 7 4 3
10 9 5 2 7 8 6 1 4 3
10 9 5 3 4 1 6 8 7 2
10 9 5 3 4 7 8 6 1 2
10 9 5 3 6 8 1 4 2 7
10 9 5 7 2 4 1 8 6 3
10 9 7 1 4 2 5 6 8 3
10 9 7 1 4 3 8 6 5 2
10 9 7 2 4 5 6 8 3 1
10 9 7 2 6 3 5 1 8 4
10 9 7 5 2 4 1 6 8 3
10 9 7 6 2 3 1 5 8 4
10 9 7 8 3 4 1 6 5 2
10 9 7 8 4 3 1 5 6 2
10 9 7 8 4 3 6 5 1 2
10 9 8 1 5 3 6 2 7 4
10 9 8 4 3 2 6 1 5 7
10 9 8 4 7 5 1 2 6 3
10 9 8 4 7 5 3 6 2 1
10 9 8 5 1 3 2 6 7 4
10 9 8 6 1 2 5 7 4 3
10 9 8 6 1 7 5 2 4 3
10 9 8 6 3 5 1 2 4 7
10 9 8 6 3 5 7 4 2 1
10 9 8 7 2 6 1 5 3 4
10 9 8 7 4 3 5 6 1 2
打表结果
复制代码

  可以发现除了1以外的奇数都是没有解的,因此直接特判1,否则如果是奇数那么直接输出1。然后偶数必然有解,其中对于长度为n的排列第一个数必然是p1=n。继续从小数据往大数据看必然存在pn/2+1=n2的排列。继续看n=6的情况,发现在排列的左半边(即[1,n2])中的1都与右半边的4对应,左半边的5都与右半边的2对应,并且12不能同时出现在左半边。因此直接乱猜结论:先构造出p=[n,n1,,1],然后i2开始枚举到n2,迭代步长为2,然后交换pipni+2。例如当n=8,那么构造出序列p=[8,3,6,1,4,7,2,5]。然后这样做发现确实可以过。

  AC代码如下:

复制代码
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int N = 2e5 + 10;
 5 
 6 int p[N];
 7 
 8 void solve() {
 9     int n;
10     scanf("%d", &n);
11     if (n & 1) {
12         if (n == 1) printf("1\n");
13         else printf("-1\n");
14         return;
15     }
16     for (int i = 1; i <= n; i++) {
17         p[i] = n - i + 1;
18     }
19     for (int i = 2; i <= n >> 1; i += 2) {
20         swap(p[i], p[n - i + 2]);
21     }
22     for (int i = 1; i <= n; i++) {
23         printf("%d ", p[i]);
24     }
25     printf("\n");
26 }
27 
28 int main() {
29     int t;
30     scanf("%d", &t);
31     while (t--) {
32         solve();
33     }
34     
35     return 0;
36 }
复制代码

  直接给出官方题解的思路,这种题是真没意思。

  令kn在排列中的位置,即pk=n,可以证明k必然等于1。否则如果k>1,那么bk=(bk1+pk)modn=bk1,这就与题意矛盾了。

  如果n>1并且为奇数,那么有bn=(a1+a2++an)modn=(1+2++n)modn=nn+12modn=0=b1,因此无解。

  如果n是偶数,一种可行的构造方案是p=[n, 1, n2, 3, n4, 5, , n1, 2],这是因为b=[0, 1, n1, 2, n2, 3, n3, , n2]

  AC代码如下:

复制代码
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 void solve() {
 5     int n;
 6     scanf("%d", &n);
 7     if (n & 1) {
 8         if (n == 1) printf("1\n");
 9         else printf("-1\n");
10         return;
11     }
12     for (int i = 0; i < n; i++) {
13         if (i & 1) printf("%d ", i);
14         else printf("%d ", n - i);
15     }
16     printf("\n");
17 }
18 
19 int main() {
20     int t;
21     scanf("%d", &t);
22     while (t--) {
23         solve();
24     }
25     
26     return 0;
27 }
复制代码

 

参考资料

  Codeforces Round #867 (Div. 3) Editorial:https://codeforces.com/blog/entry/115409

posted @   onlyblues  阅读(141)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
Web Analytics
点击右上角即可分享
微信分享提示