P9451 题解
部分分解法
- 。判断后直接枚举即可。
- 保证 合法。不判断直接枚举即可。
- 保证 随机。不可以总司令即可。
正解
使用 __builtin_popcountll(long long) 函数,然后判断是否合法。
不难发现,popcount 的值为 或 时,下一个合法数即是 。
而 popcount 的值为 时,下一个合法值为在二进制下最后一个 的位置 。即 , 为末尾 的个数。
记得开 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;
}