# B 二进制

题目链接: https://ac.nowcoder.com/acm/contest/8564/B

image-20210221185340310 image-20210221185431834

单纯与或者单纯或单纯异或都支持交换律,但是他们放在一起就不支持交换律了,比如 1 先和 0 与再和 1 或结果是 1,但是 1 先和 1 或再和 0 与结果就不一样,可以设两个数,一个所有位都是 0,一个所有位都是 1,把这两个分别进行上述操作,最后得出来的结果按位对比,如果 0 变成了 1 且 1 变成了 0 则这个位肯定是异或 1,如果 0 变成 0 且 1 变成 0 则这一位是与 0,如果 0 变成 1 且 1 变成 1 这一位肯定是或 1,按照这个规律可以求出这个数,任何一个数与 1 或 0 异或 0 都不变,所以可以设置三个数,一个全设为 1,另外两个全设为 0,当这个位是与 0 时,就用全为 1 的变量减去 (1<<i) 这一位上的数,另外两个同理

#include <bits/stdc++.h>
#define debug freopen("in.txt","r",stdin); freopen("out.txt","w",stdout)
#define ios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int MAXN=1e6+100;
const double pi=acos(-1);
const int MOD=1e9+7;
const int INF=0x3f3f3f3f;
const int SUB=-0x3f3f3f3f;
const int eps=1e-4;
int a=0,b=(1<<20)-1;
int main(){
	ios;
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		int op,v;
		cin>>op>>v;
		if(op==1){
			a&=v;
			b&=v;
		}
		else if(op==2){
			a|=v;
			b|=v;
		}
		else{
			a^=v;
			b^=v;
		}
	}
	int yu=(1<<20)-1,huo=0,yihuo=0;
	for(int i=0;i<20;i++){
		if( (a>>i)&1 ){
			if((b>>i)&1) huo+=(1<<i);
			else yihuo+=(1<<i);
		}
		else if(!((b>>i)&1)) yu-=(1<<i);
	}
	cout<<3<<'\n';
	cout<<1<<' '<<yu<<'\n';
	cout<<2<<' '<<huo<<'\n';
	cout<<3<<' '<<yihuo<<'\n';
	return 0;
}
更新于

请我喝[茶]~( ̄▽ ̄)~*

PocketCat 微信支付

微信支付

PocketCat 支付宝

支付宝