传送门:
题意
给
u
和
v
,
问
u
能
不
能
到
达
v
。
给u和v,问u能不能到达v。
给u和v,问u能不能到达v。
u
能
到
达
u
+
v
的
条
件
是
u
&
v
=
v
。
u能到达u+v的条件是u\&v=v。
u能到达u+v的条件是u&v=v。
思路
因 为 u 到 u + v 的 条 件 是 u & v = v 。 & 和 二 进 制 有 关 , 所 以 比 较 u 和 v 的 二 进 制 。 因为u到u+v的条件是u\&v=v。\& 和二进制有关,所以比较u和v的二进制。 因为u到u+v的条件是u&v=v。&和二进制有关,所以比较u和v的二进制。
如
果
u
>
v
,
那
u
绝
对
到
不
了
v
。
如果u>v,那u绝对到不了v。
如果u>v,那u绝对到不了v。
如
果
u
=
=
v
,
e
m
m
m
,
不
用
动
就
能
到
达
。
如果u==v,emmm,不用动就能到达。
如果u==v,emmm,不用动就能到达。
先 给 结 论 : 计 算 u 和 v 的 二 进 制 中 1 的 个 数 , 做 一 个 前 缀 和 , 对 于 每 一 位 必 须 a [ i ] > = b [ i ] 能 保 证 u 到 v 。 先给结论:\red{计算u和v的二进制中1的个数,做一个前缀和,对于每一位必须a[i]>=b[i]能保证u到v。} 先给结论:计算u和v的二进制中1的个数,做一个前缀和,对于每一位必须a[i]>=b[i]能保证u到v。
e
g
:
对
于
3
,
(
3
)
2
=
11
,
所
以
1
,
10
,
11
,
3
可
以
到
达
3
+
1
,
3
+
2
,
3
+
3.
eg:对于3,(3)_2=11,所以1,10,11,3可以到达3+1,3+2,3+3.
eg:对于3,(3)2=11,所以1,10,11,3可以到达3+1,3+2,3+3.
e
g
:
对
于
6
,
(
6
)
2
=
110
,
所
以
10
,
100
,
110
,
6
可
以
到
达
6
+
2
,
6
+
4
,
6
+
6
,
而
6
到
达
不
了
111.
eg:对于6,(6)_2=110,所以10,100,110,6可以到达6+2,6+4,6+6,而6到达不了111.
eg:对于6,(6)2=110,所以10,100,110,6可以到达6+2,6+4,6+6,而6到达不了111.
就
是
因
为
6
的
第
一
位
是
0
,
7
的
第
一
位
是
1
,
已
经
不
能
满
足
结
论
了
。
就是因为6的第一位是0,7的第一位是1,已经不能满足结论了。
就是因为6的第一位是0,7的第一位是1,已经不能满足结论了。
Code
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
void solve() {
int _; cin >> _;
while(_--) {
ll u, v; cin >> u >> v;
vector<int> a(100, 0), b(100, 0);
for(int i = 0;i <= 30; i++) {
a[i] = u >> i & 1;
b[i] = v >> i & 1;
}
for(int i = 1;i <= 30; i++) {
a[i] += a[i - 1];
b[i] += b[i - 1];
}
if(u > v) cout << "NO" << endl;
else if(u == v) cout << "YES" << endl;
else {
bool flag = 1;
for (int i = 0; i <= 30; i++) {
if (a[i] < b[i]) {
flag = 0;
break;
}
}
if (flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
}
signed main() {
solve();
}