Codeforces 19491D. Zookeeper and The Infinite Zoo(数位运算,贪心,数论)

题目链接


题目大意: 满足(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;
}

猜你喜欢

转载自blog.csdn.net/weixin_45911397/article/details/114699558