「题解」:位运算
问题 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; }