1 条题解

  • 0
    @ 2025-8-24 22:48:29

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar maomao233
    私信互关aaa 因为 400 粉儿以后看不到了。 ⎛⎝≥⏝⏝≤⎛⎝

    搬运于2025-08-24 22:48:29,当前版本为作者最后更新于2023-07-16 13:58:06,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目传送门

    直接分类讨论:

    • 如果数 aa 满足 popcount(a)3\operatorname{popcount}(a)\ge3,直接报告无解;

    • 如果数 aa 满足 popcount(a)=1\operatorname{popcount}(a)=1,则直接输出 a+1a+1 即可,因为这样最多才使 popcount(a)=2\operatorname{popcount}(a)=2

    • 如果数 aa 满足 popcount(a)=2\operatorname{popcount}(a)=2,就稍微麻烦一些。我们先设数 aa 在二进制表示下为 aa',则可以找到 aa' 最右侧的 11,然后将其“加 11”即可。通俗地讲,就是找到最右侧的 0101,将其变为 1010。例如:10101010 的下一个合法数字为 11001100。请注意,这个过程并不是真正的加 11

      这里可以使用 lowbit\operatorname{lowbit} 函数来找到二进制数最右侧的 11。例如,lowbit(x)\operatorname{lowbit}(x) 就是 xandxx\operatorname{and}-x。注意 lowbit\operatorname{lowbit} 函数返回的值是一个 kk 位的二进制数 $\begin{matrix}1\ \underbrace{000\cdots000}\\\ \ \ k-1\text{个}\end{matrix}$,也就是十进制数 2k2^k,所以最后将其再加上 nn 即为答案。

    得代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define pop __builtin_popcountll
    int lowbit(int x)
    {
    	return x&-x;
    }
    signed main()
    {
    	int t;
        cin>>t;
        while(t--)
    	{
    		int n;
        	cin>>n;
        	if(pop(n)>=3)
        	{
        		puts("No,Commander");
    		}
        	else if(pop(n)==1)
        	{
        		cout<<n+1<<endl;
    		}
        	else
    		{
        		cout<<n+lowbit(n)<<endl;
    		}
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    8395
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者