题解 AT5140 【[AGC035C] Skolem XOR Tree】
下面的
首先考虑无解情况。显然,当
因为这样的话会存在
考虑其他的情况。分奇数和偶数考虑。有一个比较好用的性质:
因此,如果我们假设
现在还有两个遗留的问题没有处理:
- 作为根的
1 没有匹配,如何添加1' ?
假设
- 如果
n 是偶数,那么n,n' 就会遗留,如何处理?
考虑还是在根上处理。因为无解情况排除以后可以满足
至此,我们在修修补补中完成了构造方法。
#include<cstdio>
using namespace std;
int lowbit(int x){return x&(-x);}
int main(){
int n;
scanf("%d",&n);
if(lowbit(n)==n) return puts("No")&0;
puts("Yes");
for(int i=2;i<=n-1;i+=2)
{
printf("1 %d\n",i);
printf("1 %d\n",i+n+1);
printf("%d %d\n",i,i+1);
printf("%d %d\n",i+n,i+n+1);
}
printf("%d 3\n",n+1);
if(n%2==0)
{
printf("%d %d\n",n+lowbit(n)+1,n);
printf("%d %d\n",n+n,n-lowbit(n));
}
return 0;
}