3007. 价值和小于等于 K 的最大数字

发布于 2024-08-21  7 次阅读


给你一个整数 k 和一个整数 x 。整数 num 的价值是它的二进制表示中在 x2x3x 等位置处 

设置位 的数目(从最低有效位开始)。下面的表格包含了如何计算价值的例子。

xnumBinary RepresentationPrice
1130000011013
2130000011011
22330111010013
3130000011011
33621011010102

num 的 累加价值 是从 1 到 num 的数字的  价值。如果 num 的累加价值小于或等于 k 则被认为是 廉价 的。

请你返回 最大 的廉价数字。

示例 1:

输入:k = 9, x = 1

输出:6

解释:由下表所示,6 是最大的廉价数字。

xnumBinary RepresentationPriceAccumulated Price
1100111
1201012
1301124
1410015
1510127
1611029
17111312

示例 2:

输入:k = 7, x = 2

输出:9

解释:由下表所示,9 是最大的廉价数字。

xnumBinary RepresentationPriceAccumulated Price
21000100
22001011
23001112
24010002
25010102
26011013
27011114
28100015
29100116
210101028
class Solution {
    public long findMaximumNumber(long k, int x) {
        long l = 1, r = (k + 1) << x;
        while (l < r) {
            long m = (l + r + 1) / 2;
            if (accumulatedPrice(x, m) > k) {
                r = m - 1;
            } else {
                l = m;
            }
        }
        return l;
    }

    public long accumulatedPrice(int x, long num) {
        long res = 0;
        int length = 64 - Long.numberOfLeadingZeros(num);
        for (int i = x; i <= length; i += x) {
            res += accumulatedBitPrice(i, num);
        }
        return res;
    }

    public long accumulatedBitPrice(int x, long num) {
        long period = 1L << x;
        long res = period / 2 * (num / period);
        if (num % period >= period / 2) {
            res += num % period - (period / 2 - 1);
        }
        return res;
    }
}