给出一个数 n ,找出任意三个数 a b c 满足
( a ⊕ b ) + ( b ⊕ c ) + ( a ⊕ c ) = n (a⊕b)+(b⊕c)+(a⊕c)=n (a⊕b)+(b⊕c)+(a⊕c)=n
首先根据
a
+
b
=
a
⊕
b
+
2
∗
(
a
&
b
)
a+b=a⊕b+2*(a\&b)
a+b=a⊕b+2∗(a&b)
这个式子可知
a
⊕
b
a⊕b
a⊕b 的奇偶性是与
a
+
b
a+b
a+b 相同的
故
(
a
⊕
b
)
+
(
b
⊕
c
)
+
(
a
⊕
c
)
(a⊕b)+(b⊕c)+(a⊕c)
(a⊕b)+(b⊕c)+(a⊕c)的奇偶性是与
(
a
+
b
)
+
(
b
+
c
)
+
(
a
+
c
)
(a+b)+(b+c)+(a+c)
(a+b)+(b+c)+(a+c) 相同的,是与
2
∗
(
a
+
b
+
c
)
2*(a+b+c)
2∗(a+b+c) 的奇偶性相同 ,故 可证得 n 一定是个偶数 , 故在奇数情况下无解;
然后是构造,根据性质 a ⊕ 0 = a a⊕0=a a⊕0=a 我们 可以构造 0 0 n 2 n\over2 2n 三个数
#include<bits/stdc++.h>
using namespace std;
int n,t;
int main()
{
cin>>t;
while(t--)
{
cin>>n;
if(n%2!=0) puts("-1");
else cout<<"0 0 "<<n/2<<endl;
}
}
矩阵构造,使得每个块相连的块与其不同的恰好只有两个
把 n 与 m 取得稍大一点画出图既能看出规律
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a,b;
int t;
int s[51][51];
int main()
{
cin>>t;
while(t--)
{
cin>>a>>b;
s[1][1]=1;
s[1][2]=0;
s[2][1]=0;
s[2][2]=1;//先构造 2*2 的最小单位块
for(int i=3;i<=b;i++)
if(i%2==0) s[1][i]=s[1][i-3];
else s[1][i]=s[1][i-1];
for(int i=3;i<=b;i++)
if(i%2==0) s[2][i]=s[2][i-3];
else s[2][i]=s[2][i-1];//构造前两行
for(int i=3;i<=a;i++)
{
if(i%2==0)
{
for(int j=1;j<=b;j++)
{
s[i][j]=s[i-3][j];
}
}
else
{
for(int j=1;j<=b;j++)
{
s[i][j]=s[i-1][j];
}
}
}//构造后面行
for(int i=1;i<=a;i++)
{
for(int j=1;j<=b;j++)
{
cout<<s[i][j]<<" ";
}
puts("");
}
}//输出
return 0;
}