LC 2081 [H] Sum of k Mirror Numbers - ALawliet/algorithms GitHub Wiki

focus on base 2

class Solution:
    def kMirror(self, k: int, n: int) -> int:
        
        def nextpalindrome(x):
            """Return next k-symmetric number."""
            n = len(x)//2
            for i in range(n, len(x)): 
                if int(x[i])+1 < k: 
                    x[i] = x[~i] = str(int(x[i])+1)
                    for j in range(n, i):
                        x[j] = x[~j] = '0'
                    return x
            return ["1"] + ["0"]*(len(x)-1) + ["1"]
                
        x = ["0"]
        ans = 0
        for _ in range(n): 
            while True: 
                x = nextpalindrome(x)
                val = int("".join(x), k)
                # print(f'x={x} val={val} str(val)[::-1]={str(val)[::-1]} str(val)={str(val)}')
                if str(val)[::-1] == str(val): break # k smallest numbers
            ans += val
        return ans