Zookeeper and The Infinite Zoo
显然我们应该用qlogn的复杂度
我们考虑位运算
当u>v的时候显然我们不可以过去 直接特判掉
因为我们的u->u+v 当且仅当u&v=v 意思就是v是u的子集
我们考虑如何check 是否合法
显然对于v的位数不能大于u的位数 因为我们u的位数只增不减
因为这个性质 我们考虑从低位到高位
u后面的位显然不能少于v后面的位数
不然我们就肯定过不去
可以感性理解一下 要是位数够的话肯定有方法过去的
#include <bits/stdc++.h>
using namespace std;
const int N = 5e6+10;
const int M = 998244353;
const int mod = 998244353;
#define int long long
int up(int a,int b){return a<0?a/b:(a+b-1)/b;}
#define endl '\n'
#define all(x) (x).begin(),(x).end()
#define YES cout<<"YES"<<endl
#define NO cout<<"NO"<<endl
#define _ 0
#define pi acos(-1)
#define INF 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
void solve() {
int u, v;
cin >> u >> v;
if (v < u) {
NO;
return;
}
int cnta = 0, cntb = 0;
for (int i = 0; i <=30 ; i++) {
if (u >> i & 1) {
cnta++;
}
if (v >> i & 1) {
cntb++;
}
if(cntb>cnta){
NO;
return;
}
}
YES;
}
signed main(){
fast
int t;t=1;cin>>t;
while(t--) {
solve();
}
return ~~(0^_^0);
}
标签:const,cntb,cnta,int,CF1491D,位数,return
From: https://www.cnblogs.com/ycllz/p/16834152.html