- 异或运算对加法不满足分配律
- mod(2^32)可以视为保留二进制表示下的32位
- 大胆猜测解是唯一的
点击查看代码
#include <bits/stdc++.h>
using namespace std;
unsigned int a[300005],b[300005],ans[300005];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while(T--)
{
int q;
cin>>q;
for(int i=1;i<=q;i++)
{
cin>>a[i]>>b[i];
}
for(int i=31;i>=0;i--)
{
for(int j=1;j<=q;j++)
{
int x=((a[j]>>i)&1),y=((b[j]>>i)&1);
if(x==1&&y==0||x==0&&y==1)
{
ans[j]+=(1<<i);
}
}
}
//处理了所有1+0和0+1的和
for(int i=0;i<=31;i++)
{
ans[0]=ans[q];
for(int j=1;j<=q;j++)
{
int x=((a[j]>>i)&1),y=((b[j]>>i)&1);
if(x==0&&y==0)
{
if(((ans[j-1]>>i)&1)==1)
{
ans[j]+=(1<<i);
ans[j]+=(1<<i);
}
}
if(x==1&&y==1)
{
if(((ans[j-1]>>i)&1)==0)
{
ans[j]+=(1<<i);
ans[j]+=(1<<i);
}
}
}
}
//处理了所有0+0的和以及1+1的和
for(int i=1;i<=q;i++)
{
cout<<ans[i]<<"\n";
ans[i]=0;
}
}
return 0;
}