题解:P12682 【MX-J15-T2】叉叉学习位运算
思路详解
需要点思维的题,主要是考察二进制。
因为 >>1 和 <<1 这两个操作是在二进制的基础上实现的,所以我们先把
而使用这两个运算后对原数最明显的变化就是所有数向左或向右移动一位,如果溢出,就会导致消失一位,且移动后留下的空位以
又因为二进制相等的两个数相等,所以只需要通过删去
写完代码提交后我们就会发现只能获得
然后就可以获得
代码
#include<bits/stdc++.h>
using namespace std;
long long t;
std::istream& operator>>(std::istream& is, __int128& n)
{
string s;
is>>s;
n=0;
bool negative=false;
size_t start=0;
if (s[0]=='-')
{
negative=true;
start=1;
}
for(size_t i=start;i<s.size();i++)
{
n=n*10+(s[i]-'0');
}
if(negative)n=-n;
return is;
}
int main()
{
cin>>t;
for(int i=1;i<=t;i++)
{
__int128 a,b;
long long c[100009],d[100009],e=0,f=0,ok1=0,qd0=1;
cin>>a>>b;
for(;a>0;)
{
e++;
c[e]=a%2;
a/=2;
}
for(;b>0;)
{
if(b%2!=0||qd0==0)
{
f++;
d[f]=b%2;
qd0=0;
}
b/=2;
}
for(int j=1;j<=e-f+1;j++)
{
int ok=1;
for(int k=1;k<=f;k++)
{
if(d[k]!=c[j+k-1]){ok=0;break;}
}
if(ok==1){cout<<"Yes"<<endl;ok1=1;break;}
}
if(ok1==0)cout<<"No"<<endl;
}
}
完结撒花!