先想到的奇数,后来发现偶数也可以
不合法的情况:n是2的幂,因为其他的数没有最高位
首先有一个性质,2k xor 2k+1=1
也就是说2k xor 2k+1 xor 2k+2 xor 2k+3=0
当n模4余3时直接按1n,1n排成一行即可(第一项视作xor 0)这样1xor到n=0,去掉一项后刚好等于自己
当n模4余1时把n-1和n提出来按n-1,n,1,n-1,1的顺序连边即可,剩下的排成一行即可
考虑n是偶数,不考虑n就是奇数的情况
如果是一条链(%4=0),那么把n-1和n xor n-1通过交换连在一起,然后连n,n-1,n xor (n-1),n即可
如果模4=2,那么把1和n xor (n-2) xor 1连在一起,然后连n,n-2,1,n xor (n-2) xor 1,n即可
#include <bits/stdc++.h>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define ll long long
//#define file
using namespace std;
int n,i,j,k,l,x;
int jh(int t,int x,int y) {return t==x?y:(t==y?x:t);}
int main()
{
#ifdef file
freopen("agc035c.in","r",stdin);
#endif
scanf("%d",&n);
if (pow(2,floor(log2(n)))==n) {printf("No\n");return 0;}
printf("Yes\n");
if (!(n&1))
{
if (!(((n-1)+1)&2))
{
x=n^(n-1);
fo(i,1,n-2) printf("%d %d\n",jh(i,1,x),jh(i+1,1,x));
printf("%d %d\n",jh(n-1,1,x),jh(n+1,1+n,x+n));
fo(i,1,n-2) printf("%d %d\n",jh(i+n,1+n,x+n),jh(i+1+n,1+n,x+n));
printf("%d %d\n",n,n-1),printf("%d %d\n",x+n,n+n);
}
else
{
x=n^(n-2)^1;
fo(i,1,n-4) printf("%d %d\n",jh(i,2,x),jh(i+1,2,x));
fo(i,1,n-4) printf("%d %d\n",jh(i+n,2+n,x+n),jh(i+1+n,2+n,x+n));
printf("%d %d\n",jh(n-3,2,x),jh(n+1,2+n,x+n));
printf("%d %d\n",n-2,n-1),printf("%d %d\n",n-1,1),printf("%d %d\n",1,n-2+n),printf("%d %d\n",n-2+n,n-1+n);
printf("%d %d\n",n,n-2+n),printf("%d %d\n",x,n+n);
}
}
else
if (!((n+1)&2))
{fo(i,1,n+n-1) printf("%d %d\n",i,i+1);}
else
{
fo(i,1,n-3) printf("%d %d\n",i,i+1);
fo(i,1,n-3) printf("%d %d\n",i+n,i+1+n);
printf("%d %d\n",n-2,n+1);
printf("%d %d\n",n-1,n),printf("%d %d\n",n,1),printf("%d %d\n",1,n-1+n),printf("%d %d\n",n-1+n,n+n);
}
fclose(stdin);
fclose(stdout);
return 0;
}
原文:https://www.cnblogs.com/gmh77/p/12873391.html