请教大神帮忙提升运行速度

aixbonbon 2025-06-02 14:52:24

我的程序如下:

#include <bits/stdc++.h>

using namespace std;

#define ull unsigned long long

#define ll long long

 

int main()

{

    int n = 0;

    cin >> n;

    while (n--)

    {

        ull a = 0, b = 0;

        bool flg = 0;

        cin >> a >> b;

        if (b==0)

        {

            cout << "Yes\n";

            continue;

        }

        while (!(b & 1) && b) b >>= 1;

        while (a>=b)

        {

            ll t = a ^ b;

            if (((a & b) == b) && ((t & -t) > b || !t))

            {

                flg = 1;

                break;

            }

            a >>= 1;

        }; cout << (flg ? "Yes" : "No") << endl;

    }

}

 

 

题目描述

叉叉学习了两种位运算:<< 和 >>。为了避免 undefined behavior(未定义行为),叉叉只讨论非负整数下的情况。当 << 时,最高位会溢出,最低位会补 0;当 >> 时,最低位会溢出,最高位会补 0

小粉兔决定考考叉叉,于是想了两个非负整数 a,b。小粉兔希望叉叉判断,a 能否利用若干次 << 1 和 >> 1 运算变成 b。

输入格式

本题有多组数据。

第一行一个正整数 T,表示数据组数。

对于每组数据:一行两个非负整数 a,b。

输出格式

对于每组数据:

若 a 能利用若干次 << 1 和 >> 1 运算变成 b,则一行一个字符串 Yes,否则一行一个字符串 No

输入输出样例

输入 #1

6
1 0
0 1
3 7
7 3
4 6
153 6

输出 #1

Yes
No
No
Yes
No
Yes

 

...全文
396 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
#include <stdio.h>

int main()
{
  unsigned int a, b, i, m, t, x;
  const unsigned int msb = sizeof(msb) * 8 - 1;

  for (scanf("%u", &t); scanf("%u%u", &a, &b), t; t--)
  {
    if (a == b || (a && !b)) x = 1; else if (!a && b) x = 0; else
    {
      for (i = 0; !((b << i) & (1 << msb)); i++);
      for (m = 0; !((b >> m) & 1); m++);
      m = (unsigned int)-1 >> i & -1 << m;
      for (x = i = 0; i <= msb; i++) if ((x = (a << i & m & b) == b)) break;
      for (i = 0; !x && i <= msb; i++) if ((x = (a >> i & m & b) == b)) break;
    }
    x ? puts("Yes") : puts("No");
  }

  return 0;
}

70,017

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧