• 「题解」:位运算


    问题 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
    ",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
    ",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
    ",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
    ",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
    ",ans);
    			continue;
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    ffmpeg一些filter使用方法、以及一些功能命令
    Hibernate调试——定位查询源头
    emmet语法
    [心得]传统IT转互联网面试经验分享
    Java中的集合类型的继承关系图
    Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式
    oracle求时间差的常用函数
    jdbc读取新插入Oracle数据库Sequence值的5种方法
    Xpath语法格式整理
    Oracle中 Instr 这个函数
  • 原文地址:https://www.cnblogs.com/xingmi-weiyouni/p/11711322.html
Copyright © 2020-2023  润新知