链接:https://ac.nowcoder.com/acm/contest/23479/K
来源:牛客网
小红拿到了一个正整数 xx 。她想构造一个正整数 yy,满足以下性质:
- yy 是 xx 的倍数,且 xx 和 yy 不能相等。
- xx 在二进制表示下(为一个01串)是 yy 的二进制表示的一个子串。且 xx 和 yy 的二进制表示的1的个数不能相同。
- yy 必须为不超过 10^{19}10
19
的正整数。
举个例子:
若 x=5x=5 :
那么构造的 yy 不能是5,因为这样 yy 和 xx 相等,所以非法。
也不能是 6,因为这样 yy 不是 xx 的倍数,所以非法。
也不能是 10 ,因为这样 yy 的二进制表示是 1010、xx 的二进制表示是101,虽然 yy 是 xx 的倍数且 xx 的二进制是 yy 的一个子串,但它们的 '1' 的个数相同,所以非法。
最简单的构造 保证 是倍数 是二进制字串 比x大
左移 左移后加上x即可 在x的基础上左移
#include <iostream>
using namespace std;
typedef long long ll;
int getLen(ll x){//获得位数
int ans = 0;
while(x > 0){
x >>= 1;
ans++;
}
return ans;
}
int main(){
ll x;
cin >> x;
ll y = x << getLen(x);
y += x;
cout << y;
return 0;
}