题目描述
输入描述:
输出描述:
代码:
#include<bits/stdc++.h>
using namespace std;
int lowbit(int x)
{
return x&-x;
}
void solve()
{
int a;
cin>>a;
if(a==1)
{
cout<<"2 3"<<endl;
}
else if(a==1e9)
{
cout<<lowbit(a)<<" "<<a-lowbit(a)<<endl;
}
else
{
cout<<1<<" "<<(1^a)<<endl;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}
代码讲解:
首先,这道题考察位运算中的异或,何为异或,一句口诀,相同为0,不同为1,将数字化为二进制的表示形式,然后让其按位进行异或操作,关于异或我们需要知道,a^b^c=a^(b^c)
a^0=a, a^a=0,因此这道题,我们就可以 令 b=1, c=1^a, 如果a为奇数,那么1^a= a-1 , 如果a为偶数则,1^a=a+1 为奇数,主要这道题要求b和c 在1到1e9的范围之间,因此,当a=1e9时,c=1e9+1,超过范围了,而a=1时,c=0,也不行,因此a=1 和 a=1e9都需要进行特判,当a=1 时,题目已经给出了2 和 3 了,当a=1e9时,我们使用lowbit来计算,因为,lowbit是找到a二进制表示当中最低位的1,n-lowbit(n) 只改变了最低位的1,只让第x位,由1变为0,lowbit(n) 是只有第x位为1,其它位全部为0,而0对异或没有影响,因此和(n-lowbit(n))进行异或就可以得到 n,只要n不是2的整数次幂即可