問題概要
問題ページ
質問用紙
高橋君は \(7\) が嫌いです。
\(1\) 以上 \(N\) 以下の整数のうち、\(10\) 進法で表しても \(8\) 進法で表しても \(7\) を含まないような数はいくつありますか?
制約
- \(1 \leq N \leq 10 ^ 5 \)
- \(N\) は整数である。
問題の考察
制約が\(1 \leq N \leq 10^5\)なので全検索することが可能。
\(n\)進数への変換divmod
を使えば簡単にできる。
\(1 \leq N \leq 10^5\)なので\(8^5=32,768\)から\(8\)進数に変換した場合の最大桁数は\(5\)桁となることが分かる。
\(8^n\)は何度も使うので最初にリストを作っておくと良い。
解答方法
- for文で\(N\)で全検索
- \(N\)を文字列に変換して\(7\)が含まれていないか確認
- \(N\)を8進数に変換して\(7\)が含まれていないか確認
- 含まれていなければカウント
たびすけ
\(n\)進数へ変換する場合には
文字列中に該当文字列があるかどうかは
divmod
を使えば簡単です。文字列中に該当文字列があるかどうかは
count
を使うとコーディングが簡単です!ACコード
import sys
def solve(): input = sys.stdin.readline mod = 10 ** 9 + 7 n = int(input().rstrip('\n')) cnt = 0 dl = [pow(8, i) for i in range(5, -1, -1)] for i in range(1, n + 1): if str(i).count("7") == 0: mod_v = i is_ok = True for dv in dl: div_v, mod_v = divmod(mod_v, dv) if div_v == 7: is_ok = False break if is_ok and mod_v != 7: cnt += 1 print(cnt)