P9496 「RiOI-2」hacker 题解
感谢 @lianchanghua 帮忙修改 Markdown 和
题目大意:
给出两个数
解题思路:
-
-
我们可以知道,通过一次按位与上一个
0 可以使任意一位变成0 ;按位或上一个1 可以使任意一位变成1 。因此转化思维:我们一次可以将二进制下的n 任意几位变成1 或者变成0 ,问有最少有多少次操作可以变成二进制下的m ? 显而易见答案不是1 次就是2 次。分三种情况讨论。
-
如果存在
n 的某些位上是0 ,而m 对应的那一位是1 ;且不存在n 的某些位上是1 ,而m 对应的那一位是0 。就可以通过把这些0 改成1 变成m ,输出1 。 -
如果存在
n 的某些位上是1 ,而m 对应的那一位是0 ;且不存在n 的某些位上是0 ,而m 对应的那一位是1 。就可以通过把这些1 改成0 变成m ,输出1 。 -
如果同时存在
n 的某些位上是0 ,而m 对应的那一位是1 ,且n 的某些位上是1 ,而m 对应的那一位是0 。可以通过两次操作将相应的0 变成1 ,相应的1 变成0 ,输出2 。
解题细节:
注意到数据范围:long long。
CODE:
#include<bits/stdc++.h>
using namespace std;
int T;
long long n,m;
int main(){
scanf("%d",&T);
while(T--){
scanf("%lld%lld",&n,&m);
if(n==m){
printf("0\n");
continue;
}
if((n|m)==n||(n|m)==m){
printf("1\n");
}else{
printf("2\n");
}
}
return 0;
}