EX23 - 再帰関数1 解説 /

実行時間制限: 2 sec / メモリ制限: 1024 MiB

説明ページに戻る


問題文

次のように定義される関数 f(n) があります。

\[ f(n)=\begin{cases} 1 & (n=0のとき)\\ f\!\left(\left\lfloor\frac{n}{2}\right\rfloor\right) + f\!\left(\left\lfloor\frac{n}{3}\right\rfloor\right) + f\!\left(\left\lfloor\frac{n}{5}\right\rfloor\right) & (n\geq 1のとき) \end{cases} \]

\lfloor x \rfloorx を整数に切り捨てた値を表します。例えば \lfloor 2.718 \rfloor=2\lfloor 3 \rfloor=3 です。

正整数 N が与えられるので f(N) を求めてください。


制約

  • 1 \le N \le 10^{18}
  • N は整数

入力

入力は次の形式で標準入力から与えられます。

N

出力

f(N) を出力してください。


ジャッジでは以下の入力例以外のケースに関してもテストされることに注意。


入力例1

3

出力例1

7

f(3)=f(1)+f(1)+f(0)=(f(0)+f(0)+f(0))+(f(0)+f(0)+f(0))+1=7 となります。


入力例2

987654321098765

出力例2

5977712553952371

ヒント

クリックでヒントを開く
  • 問題文で説明されている通りの再帰関数として f(n) を実装しましょう。
  • functools.cache により関数をメモ化することができます。


テスト入出力

書いたプログラムが AC にならず、原因がどうしてもわからないときだけ見てください。

クリックでテスト入出力を見る

テスト入力1

1

テスト出力1

3

テスト入力2

1000000000000000000

テスト出力2

7551346630825729459


解答例

必ず自分で問題に挑戦してみてから見てください。

クリックで解答例を見る
from functools import cache

@cache  # メモ化
def f(n):
    if n == 0:
        return 1
    return f(n//2) + f(n//3) + f(n//5)

N = int(input())
print(f(N))