1 条题解
-
0
自动搬运
来自洛谷,原作者为

hfjqwq
**搬运于
2025-08-24 22:48:54,当前版本为作者最后更新于2023-08-05 19:07:47,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
感谢
https://www.luogu.com.cn/user/564475改 Markdown 和 。题目大意:
给出两个数 和 , 可以通过按位或或者按位与操作变成 ,问最少多少次操作可以实现?
解题思路:
-
和 的二进制当中,如果两个数相同,则不用操作就直接得到,输出 。
-
我们可以知道,通过一次按位与上一个 可以使任意一位变成 ;按位或上一个 可以使任意一位变成 。因此转化思维:我们一次可以将二进制下的 任意几位变成 或者变成 ,问有最少有多少次操作可以变成二进制下的 ? 显而易见答案不是 次就是 次。分三种情况讨论。
-
如果存在 的某些位上是 ,而 对应的那一位是 ;且不存在 的某些位上是 ,而 对应的那一位是 。就可以通过把这些 改成 变成 ,输出 。
-
如果存在 的某些位上是 ,而 对应的那一位是 ;且不存在 的某些位上是 ,而 对应的那一位是 。就可以通过把这些 改成 变成 ,输出 。
-
如果同时存在 的某些位上是 ,而 对应的那一位是 ,且 的某些位上是 ,而 对应的那一位是 。可以通过两次操作将相应的 变成 ,相应的 变成 ,输出 。
解题细节:
注意到数据范围:,所以 和 要开
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; } -
- 1
信息
- ID
- 8282
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 1
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者