首页 > 其他分享 >F 和和和 (与运算)

F 和和和 (与运算)

时间:2023-11-11 20:23:21浏览次数:26  
标签:10 运算 long leq flag 2b

F 和和和


Description:

  • 给定两个非负整数\(a,b\),判断是否存在两个非负整数\(x,y\),使得 \(x+y=a\) 且 \(x\&y = b\)。其中,\(\&\)表示二进制的按位与运算。

Constraints:

  • \(1 \leq T \leq 10^5\)
  • \(0 \leq a,b \leq 10^{18}\)

Analysis:

  • 数据量显然不能够枚举模拟,那就从与运算的性质入手。
  • 因为 \(x\&y = b\),考虑 \(b\) 的二进制:
    情况一: \(b\) 的某位是 \(1\),则说明该位上 \(x,y\) 均为 \(1\) ;
    情况二: \(b\) 的某位是 \(0\),则说明该位上 \(x,y\) 至多一个 \(1\)
  • 考虑 \(x+y\) 最小的情况,则情况二中 \(x,y\) 对应二进制位全为 \(0\),此时 \(x+y=2b\)
  • 剩下的可加的范围即二进制位不全为1,举个栗子,对于 \(b=4=(100)_2\) 则 \(x=y=(1??)\),考虑最后两位的差值, \(??=(.10),(.01),(.11)\),其共同特点是差值与 \(b\) 的最后两位 \((.00)\) 的按位与结果为 \(0\) ,故可以调整到的差值 \(a-(x+y)_{min}=a-2b\) 和 \(b\) 与运算的结果必须为 \(0\)

Solution:

#include<bits/stdc++.h>
using namespace std;

#define mod 1000000007

typedef long long ll;
typedef unsigned long long ull;

void solve() {
	ll a,b; cin >> a >> b;
	bool flag;
	if(a < 2*b ) flag = false; // a >= 2b 是必要条件
	else if((a-2*b) & b) flag = false;
	else flag = true; 
	cout << (flag ? "YES" : "NO") << endl; //注意括号
}

int main() {
	int T; cin >> T;
	while(T--) {
		solve();
	}
	return 0;
}

标签:10,运算,long,leq,flag,2b
From: https://www.cnblogs.com/Trilliverse/p/17826230.html

相关文章

  • 加号优先级高于 三目运算。低于括号。
    假设val已经声明,可定义为任何值。则下面js代码有可能输出的结果为:console.log('Valueis'+(val!='0')?'define':'undefine');AValueisdefineBValueisundefineCdefineDundefineEValueisdefine或者ValueisundefineFdefine或者undef......
  • 四则运算
    #include<iostream>#include<stack>#include<deque>#include<string>usingnamespacestd;//C++混合四则运算intpri(charc)//标识运算符优先级{switch(c){case'+':case'-':return0;break;......
  • 运算
    #include<iostream>usingnamespacestd;intmain(intargc,char**argv){ stringn; intx=0; intn1,n2; getline(cin,n); if(n.find("")>0&&n.find("")<n.size()){ for(inti=0;i<n.size();i++){ x=n.find(&q......
  • 整数的四则运算(一步)
    #include<bits/stdc++.h>usingnamespacestd;stringno1(string);//清除多余空格intno2(string);//计算加法intno3(string);//计算减法intno4(string);//计算乘法intno5(string);//计算除法intmain(){stringstr;getline(cin,str);str=no1(st......
  • 四则运算
    #include<iostream>#include<stack>#include<deque>#include<string>usingnamespacestd;//C++混合四则运算intpri(charc)//标识运算符优先级{switch(c){case'+':case'-':return0;break;......
  • 四则混合运算
    #include<iostream>#include<stack>#include<deque>#include<string>usingnamespacestd;//C++混合四则运算intpri(charc)//标识运算符优先级{switch(c){case'+':case'-':return0;break;......
  • cf1325D. Ehab the Xorcist(位运算trick)
    https://codeforces.com/contest/1325/problem/D有一个非常经典的结论a+b=(a^b)+2(a&b)这个题就可以往上面靠,首先我们观察一下,对于两个数的情况,如果(v-u)mod2=1,必然无解,试着将它扩展一下,也是对的,因为最低一位没有进位。可以确定的是ans<=3仿照上面的式子,令a=u,b=c=((a+b......
  • Python七种运算符及其优先级
    例:a=10,b=201、算术运算符运算符描述实例+加-两个对象相加a+b输出结果30-减-得到负数或是一个数减去另一个数a-b输出结果-10*乘-两个数相乘或是返回一个被重复若干次的字符串a*b输出结果200/除-x除以yb/a输出结果2%取模-返......
  • C#语法中一个问号(?)和两个问号(??)的运算符
    (1)、C#语法中一个个问号(?)的运算符是指:可以为null的类型。 (2)、C#语法中两个问号(??)的运算符是指null合并运算符,合并运算符为类型转换定义了一个预设值,以防可空类型的值为Null。           ?? 运算符称为null合并运算符,用于定义可以为null值的类型和引用类......
  • js小数运算出现多位小数如何解决
    为什么操作小数会出现误差?浮点数值的最高进度是17位小数,但在进行运算的时候其精确度却远远不如整数;整数在进行运算的时候都会转成10进制; 而Java和JavaScript中计算小数运算时,都会先将十进制的小数换算到对应的二进制,一部分小数并不能完整的换算为二进制,这里就出现了第一次的误差......