Description
You are given two integers n and k.
For any positive integer x, define the following sequence:
p0 = xpi+1 = popcount(pi)for alli >= 0, wherepopcount(y)is the number of set bits (1's) in the binary representation ofy.
This sequence will eventually reach the value 1.
The popcount-depth of x is defined as the smallest integer d >= 0 such that pd = 1.
For example, if x = 7 (binary representation "111"). Then, the sequence is: 7 β 3 β 2 β 1, so the popcount-depth of 7 is 3.
Your task is to determine the number of integers in the range [1, n] whose popcount-depth is exactly equal to k.
Return the number of such integers.
Β
Example 1:
Input: n = 4, k = 1
Output: 2
Explanation:
The following integers in the range [1, 4] have popcount-depth exactly equal to 1:
| x | Binary | Sequence |
|---|---|---|
| 2 | "10" | 2 β 1 |
| 4 | "100" | 4 β 1 |
Thus, the answer is 2.
Example 2:
Input: n = 7, k = 2
Output: 3
Explanation:
The following integers in the range [1, 7] have popcount-depth exactly equal to 2:
| x | Binary | Sequence |
|---|---|---|
| 3 | "11" | 3 β 2 β 1 |
| 5 | "101" | 5 β 2 β 1 |
| 6 | "110" | 6 β 2 β 1 |
Thus, the answer is 3.
Β
Constraints:
1 <= n <= 10150 <= k <= 5
Solution
Python3
class Solution:
def popcountDepth(self, n: int, k: int) -> int:
if k == 0: return 1
def compute(x):
depth = 0
while x > 1:
x = x.bit_count()
depth += 1
return depth
seen = set()
for i in range(1, 65):
if compute(i) + 1 == k:
seen.add(i)
if not seen: return 0
nums = list(map(int, bin(n)[2:]))
@cache
def dp(index, tight, ones):
if index == len(nums):
return 1 if ones in seen else 0
digit = nums[index] if tight else 1
count = 0
for d in range(digit + 1):
newTight = tight and d == digit
count += dp(index + 1, newTight, ones + d)
return count
ans = dp(0, True, 0)
if k == 1 and 1 in seen:
return ans - 1
return ans