「题解」:位运算

问题 A: 位运算

时间限制: 1 Sec  内存限制: 512 MB

题面


题面谢绝公开。

题解


简单分类讨论。还是得把赛时那愚蠢的分类讨论搬上来。

三者关系
与/或/异或
 1 / 1 / 1 :矛盾。与运算为1,二者均为1,异或运算为1,要求二者该位不能相同。
 1 / 1 / 0 :不矛盾。同为1即可。[  (1,1)  /  (1,1)(1,0)(0,1)  /  (1,1)(0,0)  ]
 1 / 0 / 1 :矛盾。同情况1/1/1。
 1 / 0 / 0 :矛盾。
 0 / 1 / 1 :不矛盾。(0,1)/(1,0)两种情况。
 0 / 1 / 0 :不矛盾。(0,1)/(1,0)两种情况
 0 / 0 / 1 :矛盾。
 0 / 0 / 0 :不矛盾。(0,0)即可。
与/或
 0 / 0 :不矛盾。(0,0)即可。
 0 / 1 :不矛盾。(1,0)/(0,1)即可。
 1 / 0 :矛盾。
 1 / 1 :不矛盾。(1,1)即可。
与/异或
 0 / 0 :不矛盾。(0,0)即可。
 0 / 1 :不矛盾。(1,0)/(0,1)即可。
 1 / 0 :不矛盾。(1,1)即可。
 1 / 1 :矛盾。
或/异或
 0 / 0 :(0,0)。
 0 / 1 :矛盾。
 1 / 0 :(1,1)。
 1 / 1 :(1,0)/(0,1)。

代码:

#include<bits/stdc++.h>
#define rint register int
using namespace std;
inline void read(long long &a)
{
	a=0;int b=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')b=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){a=(a<<3)+(a<<1)+ch-'0';ch=getchar();}
	a=a*b;return ;
}
int T;
long long ra,ro,rx,ans=1;
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		ans=1;
		read(ra),read(ro),read(rx);
		if(ro==-1&&rx==-1){puts("inf");continue;}
		else if(ra==-1&&ro==-1){puts("inf");continue;}
		else if(ra==-1&&rx==-1)
		{
			for(rint i=0;i<=30;++i)
				if((ro&(1<<i)))ans*=3;
			printf("%lld\n",ans);
			continue;
		}
		else if(ra==-1)
		{
			for(rint i=0;i<=30;++i)
			{
				if((ro&(1<<i))&&(rx&(1<<i)))ans<<=1;
				else if((!(ro&(1<<i)))&&(rx&(1<<i))){ans=0;break;}
				else if((ro&(1<<i))&&(!(rx&(1<<i))))continue;
				else continue;
			}
			printf("%lld\n",ans);
			continue;
		}
		else if(ro==-1)
		{
			for(rint i=0;i<=30;++i)
			{
				if((!(ra&(1<<i)))&&(!(rx&(1<<i))))continue;
				else if((!(ra&(1<<i)))&&(rx&(1<<i)))ans<<=1;
				else if((ra&(1<<i))&&(!(rx&(1<<i))))continue;
				else{ans=0;break;}
			}
			printf("%lld\n",ans);
			continue;
		}
		else if(rx==-1)
		{
			for(rint i=0;i<=30;++i)
			{
				if((!(ra&(1<<i)))&&(!(ro&(1<<i))))continue;
				else if((!(ra&(1<<i)))&&(ro&(1<<i)))ans<<=1;
				else if((ra&(1<<i))&&(!(ro&(1<<i)))){ans=0;break;}
				else continue;
			}
			printf("%lld\n",ans);
		}
		else
		{
			for(rint i=0;i<=30;++i)
			{
				if(ra&(1<<i))
				{
					if(ro&(1<<i))
					{
						if(rx&(1<<i)){ans=0;break;}
						else continue;
					}
					else{ans=0;break;}
				}
				else
				{
					if(ro&(1<<i))ans<<=1;
					else
					{
						if(rx&(1<<i)){ans=0;break;}
						else continue;
					}
				}
			}
			printf("%lld\n",ans);
			continue;
		}
	}
	return 0;
}

 

posted @ 2019-10-21 06:26  hzoi_Joe  阅读(147)  评论(0编辑  收藏  举报