EX24 - 再帰関数2 解説 /

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

説明ページに戻る


問題文

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

f(n)=\begin{cases}0 & (n=0のとき)\\f(n-1)+1 & (n\geq 1 かつ\mathrm{popcount}(n)が奇数のとき)\\f(n-2)+1 & (n\geq 1 かつ\mathrm{popcount}(n)が偶数のとき)\end{cases}

\mathrm{popcount}(n)n を 2 進法で表したときの 1 の個数を表します。例えば 13 は 2 進法で 1101 なので \mathrm{popcount}(13)=3 です。

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


制約

  • 1 \le N \le 10^5
  • N は整数

入力

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

N

出力

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


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


入力例1

3

出力例1

2

\mathrm{popcount}(3)=2\mathrm{popcount}(1)=1 なので
f(3)=f(3-2)+1=(f(1-1)+1)+1=(0+1)+1=2 となります。


入力例2

67890

出力例2

45260

ヒント

クリックでヒントを開く
  • 問題文で説明されている通りの再帰関数として f(n) を実装しましょう。
  • \mathrm{popcount}(n)n.bit_count() で求めることができます。
  • sys.setrecursionlimit により再帰の上限回数を変更することができます。


テスト入出力

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

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

テスト入力1

1

テスト出力1

1

テスト入力2

100000

テスト出力2

66667


解答例

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

クリックで解答例を見る
# 再帰上限の引き上げ
import sys
sys.setrecursionlimit(10**6)

def f(n):
    if n == 0:
        return 0
    if n.bit_count() % 2 == 1:
      return f(n-1) + 1
    else:
      return f(n-2) + 1

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