题目大意: 满足(u&v==v)那么u可以到(u+v)。 问你n能到m吗?
思路: 我们先看(u&v==v),如果u的位上为0的话那么v对应位上也必须是0,如果u位上为1,那么v对应位上可以为0也可以为1,这样就满足,(u&v ==v),我们知道这个条件后,那么(u+v)的位上的数u位上为0的那么(u+v)位上就应该是0,u位上为1那么(u+v)位上可以是0,也可以是1.,那么u的后缀1一定都比v的后缀一多。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
typedef long long ll;
int main() {
ll t;
cin>>t;
while(t--){
ll n,m;
cin>>n>>m;
bool flag;
if(n<=m) flag=1;
else flag=0;
ll sum=0;
for(int i=0;i<=30;i++){
if((n>>i)&1) sum++;
if((m>>i)&1) sum--;
if(sum<0) flag=0;
}
if(flag) puts("YES");
else puts("NO");
}
return 0;
}