Edit

【pythonでABC192を解説】D - Base n

問題概要

問題ページ

問題文

09 からなる文字列 \(X\) と、整数 \(M\) が与えられます。

\(X\) に含まれる最も大きい数字を \(d\) とします。

\(d+1\) 以上の整数 \(n\) を選んで \(X\) を \(n\) 進法表記の数とみなして得られる値のうち、\(M\) 以下であるようなものは何種類あるでしょうか?

制約

  • \(X\) は 09 のみからなる
  • \(X\) の長さは \(1\) 以上 \(60\) 以下
  • \(X\) の先頭の文字は 0 ではない
  • \(1 \leq M \leq 10^{18}\)

問題の考察

ACコード

import sys


def solve():
    input = sys.stdin.readline
    mod = 10 ** 9 + 7
    x = str(input().rstrip('\n'))
    m = int(input().rstrip('\n'))
    if len(x) == 1:
        if int(x) <= int(m):
            print(1)
        else:
            print(0)
    else:
        cor_v = max([int(i) for i in x])
        inc_v = 10 ** 20
        while -cor_v + inc_v > 1:
            bin_v = (cor_v + inc_v) // 2
            t = 0
            is_ok = True
            for i in range(len(x)):
                t += pow(bin_v, i) * int(x[-i-1])
                if t > m:
                    is_ok = False
                    break
            if is_ok:
                cor_v = bin_v
            else:
                inc_v = bin_v
        print(cor_v - max([int(i) for i in x]))


if __name__ == '__main__':
    solve()

プログラミング

-Edit
-