(特別)フィボナッチ数列の性質③

2 secs 1024 MB
Aozora_Kotori_A's icon Aozora_Kotori_A

フィボナッチ数列の各項を自然数 nn で割った余りを並べる数列を考えよう。これを「mod n\bmod\ n の数列」と呼ぶことにする。

例えば,mod 2\bmod\ 2 の数列は

1, 1, 0, 1, 1, 0, 1,1,\ 1,\ 0,\ 1,\ 1,\ 0,\ 1,\ldots

であり,mod 3\bmod\ 3 の数列は

1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0,1,\ 1,\ 2,\ 0,\ 2,\ 2,\ 1,\ 0,\ 1,\ 1,\ 2,\ 0,\ldots

である。

すると,どちらの数列もある一定の数の並びが繰り返されている事が分かる(他の数列でも試してみよう)。この繰り返しの単位における数の個数を「周期」と呼ぶことにする。

mod 2\bmod\ 2 の数列は“ 1, 1, 01,\ 1,\ 0 ”が繰り返されていて,周期は3である。mod 3\bmod\ 3 の数列は“ 1, 1, 2, 0, 2, 2, 1, 01,\ 1,\ 2,\ 0,\ 2,\ 2,\ 1,\ 0 ”が繰り返されていて,周期は8である。

ここで,mod n\bmod\ n の数列の周期を求めよう。

問題文

次の問いに答えよ。ただし,フィボナッチ数列の第 nn 項を FnF_n とする。

  1. 22 つの自然数の組 (i, j)(i,\ j) に対して,FiF_ijj で割った余りを出力する関数 FiboMod を作成せよ。
  2. 与えられた自然数 nn に対して,mod n\bmod\ n の数列の周期を出力せよ。

ただし,必要であれば問題「フィボナッチ数列の性質①」で作成した関数 Fibonacci を利用しても構わない。利用する場合は,Fibonacci(n) の制約が 1n461\leqq \mathtt{n}\leqq 46であったことに注意すること。

一般に mod n\bmod\ n の数列の周期を求める数式は発見されておらず,そのような数式は存在しないのではないかという予想が立てられている(ウォール予想)が,現在も未解決問題となっている。

制約

  • 入力はすべて自然数
  • 2n2002\leqq n\leqq 200

 

入力

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

標準入力

nn

出力

答えの値 AA を以下の形式で出力してください。

標準出力

AA

 

サンプル1

入力
11
出力
10

mod 11\bmod\ 11の数列は

1, 1, 2, 3, 5, 8, 2, 10, 1, 0繰り返される, 1, 1, 2, 3,\underbrace{1,\ 1,\ 2,\ 3,\ 5,\ 8,\ 2,\ 10,\ 1,\ 0}_{繰り返される},\ 1,\ 1,\ 2,\ 3,\ldots

となっているので,周期は10です。

 

サンプル2

入力
150
出力
600

 

関数 FiboMod に関するヒント

関数 FiboMod を,関数 Fibonacci を使用して作成すると,第46項以降を正しく出力することができません。これは,Fibonacci(n)n46\mathtt{n}\geqq 46 のときにオーバーフローして正しい値を出力することができないためです。

つまり,関数 Fibonacci を使って関数 FiboMod を作成することはできないということです。

ではどうすればよいかというと,関数 Fibonacci の骨格はそのままにオーバーフローしないように関数 FiboMod を作成すればよいのです。そのためには,次の性質を使います。

性質

自然数 m, nm,\ naa で割った余りがそれぞれ p, qp,\ q であるとき,すなわち mp, nq(moda)m\equiv p,\ n\equiv q\pmod{a}であるとき,

m+nm+naa で割った余りと p+qp+qaa で割った余りが等しい,すなわち m+np+q(moda)m+n\equiv p+q\pmod{a} である。

それでは,Good Luck!

Submit


Go (1.21)