牛客周赛 Round 56 异或故事
题目描述

输入描述:
输出描述:

代码:
#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的整数次幂即可

