筑波大学プログラミングコンテスト2025
コンテスト日時
2025/11/16 (Su) 13:15 - 16:45

D - Increment Twice Fibonacci

Benihuki
2
s
1024
MB
400

問題文

長さ $2$ の数列 $A = (0, 1)$ があります。この数列に対して、以下の $3$ 種類の操作が行えます。

  • 操作 I (Increment): $A$ の末尾の数を $x$ とします。 $A$ の末尾に $x+1$ を追加します。
  • 操作 T (Twice): $A$ の末尾の数を $x$ とします。 $A$ の末尾に $2x$ を追加します。
  • 操作 F (Fibonacci): $A$ の末尾から $2$ つの数を $x,y$ とします。 $A$ の末尾に $x+y$ を追加します。

shiba君は、数列 $A$ にいずれかの操作を $0$ 回以上行うことで、数列 $A$ の末尾を $N$ にしたいです。
ただし、shiba君は飽きっぽいので、同じ操作を $2$ 回連続で行うことはできません。

必要な操作回数の最小値を求め、最小値を達成する操作列を $1$ つ構築してください。
なお、この問題の制約下で、必要な操作回数の最小値は $10^5$ 以下であることが証明できます。

$T$ 個のテストケースが与えられるので、それぞれについて答えを求めてください。

制約

  • $2 \leq N \leq 10^{18}$
  • $1 \leq T \leq 100$
  • 入力される値はすべて整数

部分点

この問題には、部分点が設定されている。部分点の採点方法については、コンテストトップ を参照すること。

  1. ($100$ 点)
  • $2 \leq N \leq 10^5$
  1. ($300$ 点)
  • 追加の制約はない。

入力

入力は以下の形式で標準入力から与えられる。

$T$
$\rm{case}_1$
$\rm{case}_2$
$\vdots$
${\rm case}_T$

${\rm case}_i$ は $i$ 番目のテストケースを表す。各テストケースは以下の形式で与えられる。

$N$

出力

$T$ 行出力せよ。 $i$ 行目には、 $i$ 番目のテストケースに対する最小の操作回数 $L$ と、操作列 $S$ を空白区切りで出力せよ。
操作列が複数存在する場合は、どれを出力してもよい。
ただし、操作列 $S$ は長さ $L$ の文字列であり、 $i$ 文字目 ( $1\leq i \leq L$ ) は $i$ 回目の操作に対応する英大文字で構成される。

入力例 1
2 6 10
出力例 1
3 ITF 4 ITIT

1つ目のテストケースについて説明します。

  • 数列の初期状態は $A=(0,1)$ です。
  • 操作 I により、 末尾の数 $x$ が $1$ であるため、 $x+1=1+1=2$ が数列の末尾に加わり $A=(0,1,2)$ となります。
  • 操作 T により、 末尾の数 $x$ が $2$ であるため、 $2x = 2\times 2=4$ が数列の末尾に加わり、 $A=(0,1, 2, 4)$ となります。
  • 操作 F により、 末尾から $2$ つの数 $x,y$ がそれぞれ $2,4$ であるため、 $x+y=2+4 =6$ が数列の末尾に加わり、 $A=(0,1,2,4,6)$ となります。

数列 $A$ の末尾を $6$ にする操作回数を $3$ 回よりも少なくすることができないため、正解となります。
他にも、 TIT と回答しても正解となります。

この入力は,部分点 1., 2.の制約を満たします。

入力例 2
1 98912471925791241
出力例 2
81 ITFTFTFTFTIFTIFTFTIFTITITIFTFTIFTFTFTFTIFTFTFITFITFTFTFITFTITFTFTIFTFITFTFTIFTFTF

部分点 2.の制約を満たします。

提出
C++23 (g++ 12.2.0)