フィボナッチ数列の各項を自然数 で割った余りを並べる数列を考えよう。これを「 の数列」と呼ぶことにする。
例えば, の数列は
であり, の数列は
である。
すると,どちらの数列もある一定の数の並びが繰り返されている事が分かる(他の数列でも試してみよう)。この繰り返しの単位における数の個数を「周期」と呼ぶことにする。
の数列は“ ”が繰り返されていて,周期は3である。 の数列は“ ”が繰り返されていて,周期は8である。
ここで, の数列の周期を求めよう。
次の問いに答えよ。ただし,フィボナッチ数列の第 項を とする。
FiboMod
を作成せよ。ただし,必要であれば問題「フィボナッチ数列の性質①」で作成した関数 Fibonacci
を利用しても構わない。利用する場合は,Fibonacci(n)
の制約が であったことに注意すること。
一般に の数列の周期を求める数式は発見されておらず,そのような数式は存在しないのではないかという予想が立てられている(ウォール予想)が,現在も未解決問題となっている。
入力は以下の形式で標準入力から与えられます。
答えの値 を以下の形式で出力してください。
11
10
の数列は
となっているので,周期は10です。
150
600
FiboMod
に関するヒント関数 FiboMod
を,関数 Fibonacci
を使用して作成すると,第46項以降を正しく出力することができません。これは,Fibonacci(n)
が のときにオーバーフローして正しい値を出力することができないためです。
つまり,関数 Fibonacci
を使って関数 FiboMod
を作成することはできないということです。
ではどうすればよいかというと,関数 Fibonacci
の骨格はそのままにオーバーフローしないように関数 FiboMod
を作成すればよいのです。そのためには,次の性質を使います。
自然数 を で割った余りがそれぞれ であるとき,すなわち であるとき,
を で割った余りと を で割った余りが等しい,すなわち である。
それでは,Good Luck!