列表

详情


NC213756. 二进制

描述

scimoon 有一个坏掉的计算器,这个计算器仅接受 的数

这个计算器只支持一种操作,举个例子,输入一个数 x,这个数会按顺序进行 n 次操作,在第 i 次操作中,有一个操作符 op_i 和一个数 a_i

如果 表示这次操作是将数 x 与 a_i与运算

如果 表示这次操作是将数 x 与 a_i或运算

如果 表示这次操作是将数 x 与 a_i异或运算

操作过后 x 将会变为运算的结果

scimoon 觉得这个计算器非常地慢,于是他想对这 n 个运算做一些简化,这个艰巨的任务交给了你

具体而言,你的任务是:用不超过 5 次上面的操作,使得对于任何 ,你的操作的输出与计算器的输出一致

可以证明必然存在解

可能存在多组解,你只需要输出一组可能的解即可

输入描述

第一行一个整数 n,表示计算器的操作次数

接下来 n 行,每行两个整数 op 与 a ,按顺序描述了每次操作

输出描述

第一行一个 m,表示你的操作次数

你必须保证你输出的

接下来 m 行每行仿照输入中 的格式输出每次操作

示例1

输入:

1
1 14514

输出:

1
1 14514

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 185ms, 内存消耗: 4748K, 提交时间: 2022-08-11 15:51:47

#include <iostream>
#include <algorithm>
using namespace std;
using ll = long long;
int a = 0, b = (1 << 20) - 1;
int main()
{
	int n; cin >> n;
	while (n--)
	{
		int op, x;
		cin >> op >> x;
		if (op == 1) a &= x, b &= x;
		if (op == 2) a |= x, b |= x;
		if (op == 3) a ^= x, b ^= x;
	}
	int x = (1 << 20) - 1, y = 0, z = 0;
	for (int i = 0; i < 20; i++)
	{
		int c = a >> i, d = b >> i;
		if (c & 1 && d & 1) y |= 1 << i;
		else if (c & 1) z |= 1 << i;
		else if ((c & 1) == 0 && (d & 1) == 0) x ^= 1 << i;
	}
	printf("3\n1 %d\n2 %d\n3 %d", x, y, z);
	return 0;
}

C(clang11) 解法, 执行用时: 74ms, 内存消耗: 368K, 提交时间: 2021-02-24 17:02:00

#include <stdio.h>
int main()
{
    int n,p;int x1=1048575,x2=0,a,i,k=1;
    int A=x1,O=0,X=0;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d %d",&p,&a);
        if(p==1) {x1=x1&a;x2=x2&a;}
        else if(p==2) {x1=x1|a;x2=x2|a;}
        else if(p==3) {x1=x1^a;x2=x2^a;}
    }
    for(i=0;i<20;i++)
    {
        if(x1%2&&x2%2) O+=k;
        else if(x1%2+x2%2==0) A-=k;
        else if(x1%2==0&&x2%2) X+=k;
        k=k*2;x1=x1/2;x2=x2/2;
    }
    printf("3\n1 %d\n2 %d\n3 %d",A,O,X);
}

C++(clang++11) 解法, 执行用时: 205ms, 内存消耗: 4728K, 提交时间: 2021-01-27 19:33:55

#include <iostream>
using namespace std;
int a=0,b=1048575;
int And=b,Or=0,Xor=0;
int main(int argc, char** argv) {
	int n;
	cin >> n;
	while(n--)
	{
		int op,x;
		cin >> op >> x;
		if(op==1) a&=x,b&=x;
		if(op==2) a|=x,b|=x;
		if(op==3) a^=x,b^=x;
	}
	for(int j=0;j<20;j++)
	{
		if(a&(1<<j))
		{
			if(b&(1<<j)) Or|=(1<<j);
			else Xor^=(1<<j);
		}
		else
			if(!(b&(1<<j))) And^=(1<<j);
	}
	cout << 3 << "\n" << 1 << " " <<And << "\n" << 2 << " " << Or << "\n3 " << Xor;
	return 0;
}

上一题