返回介绍

solution / 3000-3099 / 3007.Maximum Number That Sum of the Prices Is Less Than or Equal to K / README_EN

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

3007. Maximum Number That Sum of the Prices Is Less Than or Equal to K

中文文档

Description

You are given an integer k and an integer x.

Consider s is the 1-indexed binary representation of an integer num. The price of a number num is the number of i's such that i % x == 0 and s[i] is a set bit.

Return _the greatest integer _num_ such that the sum of prices of all numbers from _1_ to _num_ is less than or equal to _k_._

Note:

  • In the binary representation of a number set bit is a bit of value 1.
  • The binary representation of a number will be indexed from right to left. For example, if s == 11100, s[4] == 1 and s[2] == 0.

 

Example 1:

Input: k = 9, x = 1
Output: 6
Explanation: The numbers 1, 2, 3, 4, 5, and 6 can be written in binary representation as "1", "10", "11", "100", "101", and "110" respectively.
Since x is equal to 1, the price of each number is the number of its set bits.
The number of set bits in these numbers is 9. So the sum of the prices of the first 6 numbers is 9.
So the answer is 6.

Example 2:

Input: k = 7, x = 2
Output: 9
Explanation: Since x is equal to 2, we should just check eventh bits.
The second bit of binary representation of numbers 2 and 3 is a set bit. So the sum of their prices is 2.
The second bit of binary representation of numbers 6 and 7 is a set bit. So the sum of their prices is 2.
The fourth bit of binary representation of numbers 8 and 9 is a set bit but their second bit is not. So the sum of their prices is 2.
Numbers 1, 4, and 5 don't have set bits in their eventh bits in their binary representation. So the sum of their prices is 0.
The second and the fourth bit of the binary representation of the number 10 are a set bit. So its price is 2.
The sum of the prices of the first 9 numbers is 6.
Because the sum of the prices of the first 10 numbers is 8, the answer is 9.

 

Constraints:

  • 1 <= k <= 1015
  • 1 <= x <= 8

Solutions

Solution 1

class Solution:
  def findMaximumNumber(self, k: int, x: int) -> int:
    @cache
    def dfs(pos, limit, cnt):
      if pos == 0:
        return cnt
      ans = 0
      up = (self.num >> (pos - 1) & 1) if limit else 1
      for i in range(up + 1):
        ans += dfs(pos - 1, limit and i == up, cnt + (i == 1 and pos % x == 0))
      return ans

    l, r = 1, 10**18
    while l < r:
      mid = (l + r + 1) >> 1
      self.num = mid
      v = dfs(mid.bit_length(), True, 0)
      dfs.cache_clear()
      if v <= k:
        l = mid
      else:
        r = mid - 1
    return l
class Solution {
  private int x;
  private long num;
  private Long[][] f;

  public long findMaximumNumber(long k, int x) {
    this.x = x;
    long l = 1, r = (long) 1e17;
    while (l < r) {
      long mid = (l + r + 1) >>> 1;
      num = mid;
      f = new Long[65][65];
      int pos = 64 - Long.numberOfLeadingZeros(mid);
      if (dfs(pos, 0, true) <= k) {
        l = mid;
      } else {
        r = mid - 1;
      }
    }
    return l;
  }

  private long dfs(int pos, int cnt, boolean limit) {
    if (pos == 0) {
      return cnt;
    }
    if (!limit && f[pos][cnt] != null) {
      return f[pos][cnt];
    }
    long ans = 0;
    int up = limit ? (int) (num >> (pos - 1) & 1) : 1;
    for (int i = 0; i <= up; ++i) {
      ans += dfs(pos - 1, cnt + (i == 1 && pos % x == 0 ? 1 : 0), limit && i == up);
    }
    if (!limit) {
      f[pos][cnt] = ans;
    }
    return ans;
  }
}
class Solution {
public:
  long long findMaximumNumber(long long k, int x) {
    using ll = long long;
    ll l = 1, r = 1e17;
    ll num = 0;
    ll f[65][65];
    function<ll(int, int, bool)> dfs = [&](int pos, int cnt, bool limit) -> ll {
      if (pos == 0) {
        return cnt;
      }
      if (!limit && f[pos][cnt] != -1) {
        return f[pos][cnt];
      }
      int up = limit ? num >> (pos - 1) & 1 : 1;
      ll ans = 0;
      for (int i = 0; i <= up; ++i) {
        ans += dfs(pos - 1, cnt + (i == 1 && pos % x == 0), limit && i == up);
      }
      if (!limit) {
        f[pos][cnt] = ans;
      }
      return ans;
    };
    while (l < r) {
      ll mid = (l + r + 1) >> 1;
      num = mid;
      memset(f, -1, sizeof(f));
      int pos = 64 - __builtin_clzll(mid);
      if (dfs(pos, 0, true) <= k) {
        l = mid;
      } else {
        r = mid - 1;
      }
    }
    return l;
  }
};
func findMaximumNumber(k int64, x int) int64 {
  var l, r int64 = 1, 1e17
  var num int64
  var f [65][65]int64
  var dfs func(pos, cnt int, limit bool) int64
  dfs = func(pos, cnt int, limit bool) int64 {
    if pos == 0 {
      return int64(cnt)
    }
    if !limit && f[pos][cnt] != -1 {
      return f[pos][cnt]
    }
    var ans int64
    up := 1
    if limit {
      up = int(num >> (pos - 1) & 1)
    }
    for i := 0; i <= up; i++ {
      v := cnt
      if i == 1 && pos%x == 0 {
        v++
      }
      ans += dfs(pos-1, v, limit && i == up)
    }
    if !limit {
      f[pos][cnt] = ans
    }
    return ans
  }
  for l < r {
    mid := (l + r + 1) >> 1
    num = mid
    m := bits.Len(uint(num))
    for i := range f {
      for j := range f[i] {
        f[i][j] = -1
      }
    }
    if dfs(m, 0, true) <= k {
      l = mid
    } else {
      r = mid - 1
    }
  }
  return l
}

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

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

发布评论

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