zyh_helen‘s Construction Round错觉题解

题目描述

构造一个长度为 n 的排列 p,满足 i=1⨁n​(pi​+k×i)=0。

其中 ⊕ 表示按位异或。

无解输出 -1。

输入格式

两个整数 n,k。

输出格式

有解输出任意一个合法排列,无解输出 -1。

输入输出样例

输入 #1复制

4 2

输出 #1复制

1 2 3 4

输入 #2复制

5 2

输出 #2复制

-1

说明/提示

样例解释

对于样例 1,i=1⨁n​(pi​+k×i)=(1+2×1)⊕(2+2×2)⊕(3+2×3)⊕(4+2×4)=3⊕6⊕9⊕12=0。

对于样例 2,可以证明不存在任何一个排列 p 满足条件。

数据范围

对于所有数据,保证 1≤n≤106,1≤k≤7。

子任务编号n≤k≤特殊性质分数
0171
11061A3
25
310327
410612
5103710
6106313
77A18
8B11
920

A:保证 n≡0(mod2×k)。

B:保证 k 为奇数。

思路

观察,直接随机构造。

代码见下

#include<bits/stdc++.h>
using namespace std;
int n,k,p[1000006],lk=0,u,v;
int main(){
    srand(time(0));
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        p[i]=i;
        lk^=(p[i]+i*k);
    }
    for(int i=1;i<=20000007;i++){
        u=rand()%n+1;
        v=rand()%n+1;
        lk^=(p[u]+u*k);
        lk^=(p[v]+v*k);
        swap(p[u],p[v]);
        lk^=(p[u]+u*k);
        lk^=(p[v]+v*k);
        if(lk==0){
            for(int j=1;j<=n;j++){
                cout<<p[j]<<" ";
            }
            cout<<endl;
            return 0;
        }
    }
    cout<<-1<<endl;
	return 0;
}

posted @ 2025-10-09 11:26  bz02_2023f2  阅读(2)  评论(0)    收藏  举报  来源