返回介绍

solution / 2900-2999 / 2939.Maximum Xor Product / README_EN

发布于 2024-06-17 01:02:58 字数 6009 浏览 0 评论 0 收藏 0

2939. Maximum Xor Product

中文文档

Description

Given three integers a, b, and n, return _the maximum value of_ (a XOR x) * (b XOR x) _where_ 0 <= x < 2n.

Since the answer may be too large, return it modulo 109 + 7.

Note that XOR is the bitwise XOR operation.

 

Example 1:

Input: a = 12, b = 5, n = 4
Output: 98
Explanation: For x = 2, (a XOR x) = 14 and (b XOR x) = 7. Hence, (a XOR x) * (b XOR x) = 98. 
It can be shown that 98 is the maximum value of (a XOR x) * (b XOR x) for all 0 <= x < 2n.

Example 2:

Input: a = 6, b = 7 , n = 5
Output: 930
Explanation: For x = 25, (a XOR x) = 31 and (b XOR x) = 30. Hence, (a XOR x) * (b XOR x) = 930.
It can be shown that 930 is the maximum value of (a XOR x) * (b XOR x) for all 0 <= x < 2n.

Example 3:

Input: a = 1, b = 6, n = 3
Output: 12
Explanation: For x = 5, (a XOR x) = 4 and (b XOR x) = 3. Hence, (a XOR x) * (b XOR x) = 12.
It can be shown that 12 is the maximum value of (a XOR x) * (b XOR x) for all 0 <= x < 2n.

 

Constraints:

  • 0 <= a, b < 250
  • 0 <= n <= 50

Solutions

Solution 1: Greedy + Bitwise Operation

According to the problem description, we can assign a number to the $[0..n)$ bits of $a$ and $b$ in binary at the same time, so that the product of $a$ and $b$ is maximized.

Therefore, we first extract the parts of $a$ and $b$ that are higher than the $n$ bits, denoted as $ax$ and $bx$.

Next, we consider each bit in $[0..n)$ from high to low. We denote the current bits of $a$ and $b$ as $x$ and $y$.

If $x = y$, then we can set the current bit of $ax$ and $bx$ to $1$ at the same time. Therefore, we update $ax = ax \mid 1 << i$ and $bx = bx \mid 1 << i$. Otherwise, if $ax < bx$, to maximize the final product, we should set the current bit of $ax$ to $1$. Otherwise, we can set the current bit of $bx$ to $1$.

Finally, we return $ax \times bx \bmod (10^9 + 7)$ as the answer.

The time complexity is $O(n)$, where $n$ is the integer given in the problem. The space complexity is $O(1)$.

class Solution:
  def maximumXorProduct(self, a: int, b: int, n: int) -> int:
    mod = 10**9 + 7
    ax, bx = (a >> n) << n, (b >> n) << n
    for i in range(n - 1, -1, -1):
      x = a >> i & 1
      y = b >> i & 1
      if x == y:
        ax |= 1 << i
        bx |= 1 << i
      elif ax > bx:
        bx |= 1 << i
      else:
        ax |= 1 << i
    return ax * bx % mod
class Solution {
  public int maximumXorProduct(long a, long b, int n) {
    final int mod = (int) 1e9 + 7;
    long ax = (a >> n) << n;
    long bx = (b >> n) << n;
    for (int i = n - 1; i >= 0; --i) {
      long x = a >> i & 1;
      long y = b >> i & 1;
      if (x == y) {
        ax |= 1L << i;
        bx |= 1L << i;
      } else if (ax < bx) {
        ax |= 1L << i;
      } else {
        bx |= 1L << i;
      }
    }
    ax %= mod;
    bx %= mod;
    return (int) (ax * bx % mod);
  }
}
class Solution {
public:
  int maximumXorProduct(long long a, long long b, int n) {
    const int mod = 1e9 + 7;
    long long ax = (a >> n) << n, bx = (b >> n) << n;
    for (int i = n - 1; ~i; --i) {
      int x = a >> i & 1, y = b >> i & 1;
      if (x == y) {
        ax |= 1LL << i;
        bx |= 1LL << i;
      } else if (ax < bx) {
        ax |= 1LL << i;
      } else {
        bx |= 1LL << i;
      }
    }
    ax %= mod;
    bx %= mod;
    return ax * bx % mod;
  }
};
func maximumXorProduct(a int64, b int64, n int) int {
  const mod int64 = 1e9 + 7
  ax := (a >> n) << n
  bx := (b >> n) << n
  for i := n - 1; i >= 0; i-- {
    x, y := (a>>i)&1, (b>>i)&1
    if x == y {
      ax |= 1 << i
      bx |= 1 << i
    } else if ax < bx {
      ax |= 1 << i
    } else {
      bx |= 1 << i
    }
  }
  ax %= mod
  bx %= mod
  return int(ax * bx % mod)
}
function maximumXorProduct(a: number, b: number, n: number): number {
  const mod = BigInt(1e9 + 7);
  let ax = (BigInt(a) >> BigInt(n)) << BigInt(n);
  let bx = (BigInt(b) >> BigInt(n)) << BigInt(n);
  for (let i = BigInt(n - 1); ~i; --i) {
    const x = (BigInt(a) >> i) & 1n;
    const y = (BigInt(b) >> i) & 1n;
    if (x === y) {
      ax |= 1n << i;
      bx |= 1n << i;
    } else if (ax < bx) {
      ax |= 1n << i;
    } else {
      bx |= 1n << i;
    }
  }
  ax %= mod;
  bx %= mod;
  return Number((ax * bx) % mod);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文