# -*- coding: utf-8 -*- # http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%202 # # 参考: http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0 # # ビネの公式によるとn番目のフィボナッチ数を求める関数は def fib(n) (((1.0 + Math.sqrt(5.0)) / 2.0) ** n / Math.sqrt(5.0) + (1.0 / 2.0)).to_i end # であり,その逆関数は def fib_inv(n) (Math.log(Math.sqrt(5.0) * (n - (1.0 / 2.0))) / Math.log((1 + Math.sqrt(5)) / 2.0)).to_i + 1 end # になる. # 4000000を超える最初のフィボナッチ数は # fib_inv(4000000) # 番目であり, # 偶数値のフィボナッチ数は3の倍数番目のみであるため, # 400万を超えない範囲での偶数値のフィボナッチ数の総和は puts (1 .. (fib_inv(4000000) / 3).to_i).reduce(0) {|s, i| s + fib(i * 3) } # となる. # # またこの式は等比数列の和の形となっているため # 等比数列の和の公式に当てはめてhogehogeすると # 以下の式でも求められることが分かる. puts (1031662 * Math.sqrt(5.0) + 2306866).to_i