問題概要
$1$以上$N$以下の整数のうち, 7
, 5
, 3
が 1 回以上現れ, なおかつそれら以外の数字が現れないものの個数を求めよ.
制約
- $1 \leq N < 10^9$
考察
bit 全探索的なノリで数えれば良さそう.
とりあえず 3 進法で書いてみたけど, 頭の0
に対応するのめんどくさそうだったから 4 進法に書き直した.
おおまかな工程
ループ変数は$i$.
- $i$を 4 進数に変換する(
tobase4
). - それが
1
,2
,3
を含んでおり, かつ0
を含んでいなければ残りの処理を続行(check
). 1
を3
,2
を5
,3
を7
に変えたとき(変換の順序に注意), それが$N$より大きいなら終了. そうでないならres++
.
提出コード(Python3🐍)
n = int(input())
def tobase4(num):
ans = ''
while num>0:
ans += str(num%4)
num //= 4
return ans[::-1]
def check(s):
if '1' in s and '2' in s and '3' in s and '0' not in s:
return True
return False
def conv(s):
s = s.replace('2','5')
s = s.replace('3','7')
s = s.replace('1','3')
return s
res = 0
for i in range(10**9):
s = tobase4(i)
if not check(s):
continue
s = int(conv(s))
if n < s:
break
res += 1
print(res)
別解
- DFS(解説はこれ)
itertools.product
- 桁 DP
- †埋め込み†