题目
给出两个数a,b。问a能否只通过位移运算( >>和 << 可以多次使用)变成b。如果可以输出"Yes",否则输出"No"。
输入
第一行:一个数 t ( 1≤t≤100000)。
第2 ~ t+1行:每行2个a,b中间用空格分隔(0≤a, b≤10^9)。
输出
输出共t行,对应答案的"Yes"和"No"
数据范围
对于20%的数据,1≤t≤50,0≤a, b≤20;
对于40%的数据,1≤t≤2000;
对于100%的数据,1≤t≤100000,0≤a, b≤10^9;
输入样例
4
4 2
2 4
3 4
1 3
输出样例
Yes
Yes
Yes
No
解题思路
当a=0时,b不管怎么位移都是0
任何大于0的a经过若干次右移终能变成0、1,而1经过n次左移只能变成2^n,
故a≥1时,b可以是a本身、…、0、1、2^n
那b为…(如3、5、6等)时呢?就需要对a进行特殊处理来得出b了:
例:
输入
2
13 5
11 20
输出
Yes
Yes
13即1101,5即101;
11即1011,20即10100;
规律:二进制b去掉末端连续0以后,总是二进制a的一部分
故我们把a和b都转换成二进制字符串,截取b串有效部分去匹配a串就可以了
AC代码
#include<bits/stdc++.h>
using namespace std;
string DecToBin(int n){
string s