問題概要
問題ページ
-
D - Base n
問題ページへ移動する
問題文
0
~ 9
からなる文字列 \(X\) と、整数 \(M\) が与えられます。
\(X\) に含まれる最も大きい数字を \(d\) とします。
\(d+1\) 以上の整数 \(n\) を選んで \(X\) を \(n\) 進法表記の数とみなして得られる値のうち、\(M\) 以下であるようなものは何種類あるでしょうか?
制約
- \(X\) は
0
~9
のみからなる - \(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()