NC235688. 或与异或
描述
给出两个数 ,可以对其进行无限次操作,每次操作可以选择 和 其中一个数作为操作对象,然后将操作对象的值变成以下三种之一,另一个不变:
。(按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为 。)
。(按位与运算符“&”是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位都为1时,结果位才为 。)
。(按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为 。)
对于每组给出的 和 ,给出一个 ,判断是否可以通过操作使得 和 其中之一变成 。
输入描述
第一行包含一个整数 ,表示 组询问。
接下来 行,每行包含三个整数 。
输出描述
输出包含 行,对于每个询问,如果 和 能通过操作得到 , 输出YES,否则输出NO。
示例1
输入:
3 1 2 3 3 2 4 3 5 3
输出:
YES NO YES
说明:
,输出 YES。
pypy3 解法, 执行用时: 438ms, 内存消耗: 28296K, 提交时间: 2022-04-22 20:08:14
for _ in range(int(input())): a, b, t = list(map(int, input().split(' '))) s = set([a, b]) for _ in range(5): news = set() for x in s: news.add(x) for x in s: for y in s: if x != y: news.add(x^y) news.add(x|y) news.add(x&y) s = news if t in s: print('YES') else: print('NO')
C 解法, 执行用时: 9ms, 内存消耗: 344K, 提交时间: 2022-04-22 20:41:12
#include <stdio.h> int main() { int T; long long a,b,t,p; int flag; scanf("%d",&T); for(int i=1;i<=T;i++){ scanf("%lld %lld %lld",&a,&b,&t); flag=0; p=a&b; if(t==a||t==b||t==p||t==0) flag=1; if(t==(a^b)||t==(b^p)||t==(a^p)||t==(a^p^b)) flag=1; if(flag==1) printf("YES\n"); else printf("NO\n"); } return 0; }
Python3 解法, 执行用时: 168ms, 内存消耗: 4672K, 提交时间: 2023-07-13 17:29:05
def slove(): a,b,t=list(map(int,input().split() )) if t in [a,b,a|b,a&b,a^b,a&(a^b),b&(a^b),a|(a^b),b|(a^b),0,a^(a&b),\ b^(a&b),a^(a|b),b^(a|b),0]: print('YES') return print('NO') return if __name__=='__main__': t=int(input()) for _ in range(t): slove()
C++ 解法, 执行用时: 44ms, 内存消耗: 524K, 提交时间: 2022-07-24 21:03:35
#include<iostream> #define MAX 1010 using namespace std; int main(){ long long t,a,b,tar; cin>>t; while (t--){ cin>>a>>b>>tar; if(tar==0||tar==a||tar==b||tar==(a&b)||tar==(a|b)||tar==(a^b)||tar==((a^b)&a)||tar==((a^b)&b)) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }