部分分解法

  • T100,a104T\le 100,a\le 10^4 。判断后直接枚举即可。
  • 保证 aa 合法。不判断直接枚举即可。
  • 保证 aa 随机。不可以总司令即可。

正解

使用 __builtin_popcountll(long long) 函数,然后判断是否合法。

不难发现,popcount 的值为 0011 时,下一个合法数即是 a+1a+1

而 popcount 的值为 22 时,下一个合法值为在二进制下最后一个 11 的位置 +1+1。即 2ctz(a)2^{\text{ctz}(a)}ctz\text{ctz} 为末尾 00 的个数。

记得开 long long

代码

#include<iostream>
using namespace std;
int t;
int main(){
    cin>>t;
    while(t--){
        long long a,pop;
		cin>>a;
		pop=__builtin_popcountll(a);
		if(pop>=3){
			cout<<"No,Commander"<<endl;
		}else{
			if(pop<=1){
				cout<<a+1<<endl;
			}else if(pop==2){
				long long ans=1,b=__builtin_ctzll(a);
				for(long long i=1;i<=b;i++){
					ans*=2ll;
				}
				ans+=a;
				cout<<ans<<endl;
			}
		}
    }
    return 0;
}