A+B Problem

题目链接

  • 异或运算对加法不满足分配律
  • 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;
}
posted @ 2024-08-25 15:30  D06  阅读(11)  评论(0编辑  收藏  举报