题目
CF1491D Zookeeper and The Infinite Zoo
题解
此题可以举例子找规律,比如u=111(二进制),当v=1,11,111,10,110,100,101时,对应的u+v=1000,1010,1110,1001,1101,1011。可以发现,u到u+v的变化,可以抽象成将1向高位移动,移动时还可能有部分1变为0。所以,如果a要到达b,就必须有足够的1,而且位置相对b而言在较低位。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int q; scanf("%d",&q);
while(q--)
{
ll a,b; scanf("%lld%lld",&a,&b);
if(a>b) {printf("NO\n"); continue;}
int c1=0,c2=0;
for(int i=0;i<=30;i++)
{
if((a>>i)&1) c1++;
if((b>>i)&1) c2++;
if(c1<c2) {printf("NO\n"); break;}
if(i==30) printf("YES\n");
}
}
return 0;
}