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≤ | 特殊性质 | 分数 |
|---|---|---|---|---|
| 0 | 1 | 7 | 无 | 1 |
| 1 | 106 | 1 | A | 3 |
| 2 | 无 | 5 | ||
| 3 | 103 | 2 | 7 | |
| 4 | 106 | 12 | ||
| 5 | 103 | 7 | 10 | |
| 6 | 106 | 3 | 13 | |
| 7 | 7 | A | 18 | |
| 8 | B | 11 | ||
| 9 | 无 | 20 |
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;
}

浙公网安备 33010602011771号