codeforces #303A Lucky Permutation Triple 构造

题目大意:给定 n ,要求构造三个0~ n1 的排列 A,B,C ,使得对于任意 i(i[0,n1]) 满足 Ai+BiCi(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(n1)2
那么 sumA+sumB=n(n1),sumC=n(n1)2
n 为偶数时这两个数显然关于n不同余,故 n <script type="math/tex" id="MathJax-Element-2374">n</script>为偶数时无解

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值