题解,构造太难想了
当 \(x\) 在二进制表示下,只有一个1时,肯定不行
如果有两个1呢?
在这种情况下,如果 \(m\) 最大的一位,位于 \(x\) 最大的一和第二大的一之间,一定失败
为什么?
分类讨论即可
反之是否成立?
设 \(x\) 最大的一位 \(a\),第二大的位 \(b\)
\(m\) 最大的一位 \(c\)
如果 \(c==a\),那么 \(m\oplus x<x\) 一定成立(\(m<x\) 且最高位为零),所以可以直接输出 \(m\)
如果 \(c<=b\),那么我们可以先得到一个中间值 \(2^{b+1}-1\) ,然后发现可以直接得到 \(m\)
code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
void solve()
{
vector<int> n_bit,m_bit;
ll n,m;
cin>>n>>m;
bool same=0,dif=0;
for(ll i=63;i>=0;i--)
{
if((n>>i)&1)
{
n_bit.push_back(i);
}
if((m>>i)&1)
{
m_bit.push_back(i);
}
}
int hi=m_bit[0];
if(n_bit.size()==1)
{
cout<<"-1\n";
return;
}
if(hi==n_bit[0])
{
cout<<1<<'\n'<<n<<' '<<m<<'\n';
return;
}
if(hi<n_bit[0])
{
if(hi>n_bit[1])
{
cout<<"-1\n";
return;
}
else
{
ll mid=(1LL<<(n_bit[1]+1))-1;
if(mid==m)
{
cout<<1<<'\n'<<n<<' '<<m<<'\n';
return;
}
cout<<2<<'\n'<<n<<' '<<mid<<' '<<m<<'\n';
return;
}
}
cout<<1<<'\n'<<n<<' '<<m<<'\n';
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
while(t--) solve();
return 0;
}
标签:Solo,ll,long,Break,Version,solve,bit
From: https://www.cnblogs.com/pure4knowledge/p/18297953