AT5140 [AGC035C] Skolem XOR Tree
https://www.luogu.com.cn/problem/AT5140
奇妙的构造题
首先发现
2
i
⊕
2
i
+
1
=
1
2i \oplus 2i+1=1
2i⊕2i+1=1
首先以
1
1
1为根
然后就
2
i
−
>
2
i
+
1
+
n
,
2
i
+
1
−
>
2
i
+
n
2i->2i+1+n,2i+1->2i+n
2i−>2i+1+n,2i+1−>2i+n
然后把
1
+
n
1+n
1+n随便接到一个叶子结点下面
如果还剩下一个,就用lowbit 瞎凑凑就好了
code:
#include<bits/stdc++.h>
#define lowbit(x) (x & -x)
using namespace std;
int n;
int main() {
scanf("%d", &n);
if(n == lowbit(n)) {
printf("No");
return 0;
}
printf("Yes\n");
for(int i = 2; i < n; i += 2) {
printf("%d %d\n", 1, i);
printf("%d %d\n", 1, i + 1);
printf("%d %d\n", i, i + n + 1);
printf("%d %d\n", i + 1, i + n);
}
printf("%d %d\n", n + 1, n + 2);
if(n % 2 == 0) {
printf("%d %d\n", n, lowbit(n));
printf("%d %d\n", n + n, n - lowbit(n) + 1);
}
return 0;
}