说明
徐老师和石老师开始玩起了石子游戏
这个石子游戏的规则是这样的,如果两堆石子的数量分别是 xx 和 yy
若满足 x\&y=yx&y=y,则可以将 yy 这堆石子放到 xx 里,这样一次操作称为一次合并
现在有一堆数量足够大的石子堆,每次他们可以从中分离出任意数量的石子变成新的一堆。
他们手上有一堆数量为 aa 的石子,现在他们想知道能否对这堆石子进行多次合并,使得这堆石子数量变成 bb
输入格式
输入第一行包含一个正整数 TT 表示共有 TT 组测试数据
对于每组测试数据:
输入一行包含两个整数 a,ba,b
对于 30\%30% 的数据,T \leq 100, 1 \leq a,b < 500T≤100,1≤a,b<500
对于 50\%50% 的数据,T \leq 1000, 1 \leq a,b < 100000T≤1000,1≤a,b<100000
对于 100\%100% 的数据,T \leq 100000, 1 \leq a,b < 2^{30}T≤100000,1≤a,b<230
输出格式
对于每组测试数据,如果可以则输出 "YES",不可以则输出 "NO"(不输出引号);
样例
输入数据 1
3
3 6
1 6
5 5
Copy
输出数据 1
YES
NO
YES
这道题其实是考位运算与观察。思路:看x化成二进制后能否把1向前移动到y那医德位置。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while (t--)
{
long long a, b;
cin>>a>>b;
if (a > b)
{
cout<<"NO"<<endl;
continue;
}
int s1 = 0, s2 = 0;
for (int i = 0; i <= 30; ++i)
{
if (a & (1 << i)) s1++;
if (b & (1 << i)) s2++;
if (s1 < s2)
{
cout<<"NO"<<endl;
break;
}
if (i == 30) cout<<"YES"<<endl;
}
}
return 0;
}