codeforces #303A Lucky Permutation Triple 构造

题目大意:给定n,要求构造三个0~n?1的排列A,B,C,使得对于任意i(i∈[0,n?1])满足Ai+Bi≡Ci(mod n)

首先我们来考虑n是奇数的情况。以n=7为例

A 0 1 2 3 4 5 6

B 6 4 2 0 5 3 1

C 6 5 4 3 2 1 0

看出来怎么构造的了么?

没错,排列A每次+1,排列B每次?2,排列C每次?1

由于n是奇数,这样可以保证A,B,C三个排列都不重复

那么n是偶数的时候怎么构造呢?n是偶数的时候无解!

为什么呢?我们可以计算一下三个排列的和!

显然每个排列的和都是n(n?1)2

那么sumA+sumB=n(n?1),sumC=n(n?1)2

当n为偶数时这两个数显然关于n不同余,故n为偶数时无解

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 100100
using namespace std;
int n;
int ans[3][M];
int main()
{
    int i,j;
    cin>>n;
    if(~n&1)
        return cout<<-1<<endl,0;
    for(i=0;i<n;i++)
    {
        ans[0][i]=i;
        ans[1][i]=((n-1-i)-i+n)%n;
        ans[2][i]=n-1-i;
    }
    for(i=0;i<3;i++)
        for(j=0;j<n;j++)
            printf("%d%c",ans[i][j],j==n-1?‘\n‘:‘ ‘);
    return 0;
}
时间: 2024-10-21 13:43:47

codeforces #303A Lucky Permutation Triple 构造的相关文章

Codeforces 482A Diverse Permutation(构造)

题目链接:Codeforces 482A Diverse Permutation 题目大意:给定N和K,即有一个1~N的序列,现在要求找到一个排序,使得说所有的|pi?pi+1|的值有确定K种不同. 解题思路:构造,1,K+1,2,K,3,K-1,... K+2,K+3 ... N. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn

构造 CodeForces 483C Diverse Permutation

题目传送门 1 /* 2 构造:首先先选好k个不同的值,从1到k,按要求把数字放好,其余的随便放.因为是绝对差值,从n开始一下一上, 3 这样保证不会超出边界并且以防其余的数相邻绝对值差>k 4 */ 5 /************************************************ 6 Author :Running_Time 7 Created Time :2015-8-2 9:20:01 8 File Name :B.cpp 9 ********************

Codeforces 429B Working out bfs构造

题目链接:点击打开链接 题意:给定n*m的矩阵 有一个人a从左上角走到右下角,只能↓或→走 另一个人b从左下角走到右上角,只能↑或→走 使得2个人的路径有且仅有一个格子是相交的. 统计2个人的权值和(相交格子的权值和不计) 问最大的权值和是多少. 思路: 首先转换一下题意,也就是找一个格子与4个角落连不相交的线. 我们观察相交的那个格子,那个格子的上下左右必然对应着一个角落. (i,j)点,那么(i-1,j)必然对应左上角或右上角的其中一个角落. 这样(i,j)点的4个相邻格子各自对应一个角落(

Codeforces 346C Number Transformation II 构造

题目链接:点击打开链接 = = 990+ms卡过 #include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> #include<vector> #include<set> using namespace std; #define N 100010 #define L(x) (x<<1) #define R(x) (x<<

CodeForces E. Lucky Array 幸运数列

CodeForces    E. Lucky Array  幸运数列 Petya loves lucky numbers. Everybody knows that lucky numbers are positive integers whose decimal representation contains only the lucky digits 4 and 7. For example, numbers 47, 744, 4 are lucky and 5, 17, 467 are n

Codeforces Round #275 (Div. 2) C - Diverse Permutation (构造)

题目链接:Codeforces Round #275 (Div. 2) C - Diverse Permutation 题意:一串排列1~n.求一个序列其中相邻两项差的绝对值的个数(指绝对值不同的个数)为k个.求序列. 思路:1~k+1.构造序列前段,之后直接输出剩下的数.前面的构造可以根据,两项差的绝对值为1~k构造. AC代码: #include <stdio.h> #include <string.h> int ans[200010]; bool vis[100010]; i

Codeforces 1163E Magical Permutation [线性基,构造]

codeforces 思路 我顺着图论的标签点进去的,却没想到-- 可以发现排列内每一个数都是集合里的数异或出来的. 考虑答案的上界是多少.如果能用小于\(2^k\)的数构造出\([0,2^k-1]\)内所有的数,那么答案就对这个\(k\)取\(\max\).很显然这一定是上界. 考虑能不能构造出一组解.把\([1,2^k-1]\)的数拎出来插入线性基里得到一组极大线性无关组,那么显然它的\(size\)就是\(k\).由于它线性无关,所以任意选取一个子集得到的异或和都不会相同,所以考虑把\(0

Codeforces 482 - Diverse Permutation 构造题

这是一道蛮基础的构造题. - k         +(k - 1)      -(k - 2) 1 + k ,    1 ,         k ,             2,    ................... \  /        \  /           \  / k          k-1          k-2 如图所示,先构造第一个数,就是1 + k, 然后接下来每个数字和上个数相差k , k -1 , k -2 这样下来,最后一个数字就是一个中间的数字,过程就

codeforces C. Diverse Permutation(构造)

题意:1...n 的全排列中 p1, p2, p3....pn中,找到至少有k个 |p1-p2| , |p2-p3|, ...|pn-1 - pn| 互不相同的元素! 思路: 保证相邻的两个数的差值的绝对值为单调递减序列..... 如果够k个了,最后将没有访问到的元素直接添加到末尾! 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 6 #d