# -*- coding: utf-8 -*- # http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2044 # # 問題の通り,2つの五角数の差が五角数になるもの最小を求める. # |P[k+1] - P[k]|がすでに見つかっている最小値よりも大きくなったら # それより小さな差は出ないので終了となる. # # と思ったけど,重いので,もっと早くに終わる条件とか最初に見つかったのが最小であるとか # あるのだろうけど,まあできてるので終わったことにします. @@memo={} def pent(n) if (pn = @@memo[n]) pn else @@memo[n] = n * (3 * n - 1) / 2 end end def inv_pent(p) (Math.sqrt(24.0 * p + 1.0) + 1.0 ) / 6.0 end def pent?(p) n = inv_pent(p) n == n.to_i end min_d = 1 << 31 j = 2 loop do c = 0 p_j = pent(j) (j - 1).downto(1) do |k| p_k = pent(k) d = (p_j - p_k).abs if (d > min_d) break end if (pent?(p_j + p_k) && pent?(d)) min_d = [min_d, (p_j - p_k).abs].min break # うー... end c += 1 end if (c == 0) break end j = j.next end puts min_d