与位运算相关

链接:https://ac.nowcoder.com/acm/contest/23479/K

来源:牛客网

小红拿到了一个正整数 xx 。她想构造一个正整数 yy,满足以下性质:

  1. yy 是 xx 的倍数,且 xx 和 yy 不能相等。
  2. xx 在二进制表示下(为一个01串)是 yy 的二进制表示的一个子串。且 xx 和 yy 的二进制表示的1的个数不能相同。
  3. 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;
}

上一篇:【面试题总结】JVM02:JVM参数调优、类加载机制


下一篇:UVA11464 Even Parity