# -*- coding: utf-8 -*- # http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2028 # # 螺旋(正方形)の面積を a,一辺の長さを b として i周目 螺旋では # b = i * 2 - 1 # a = b ** 2 # になる. # またb*b螺旋の右上対角線上の値は i周目の a と一致する. # i周目での対角線上の点は,b == 1 のとき # 1 # b > 1 かつ b が奇数のとき # a # (a - (b - 1)) # (a - (b - 1) * 2) # (a - (b - 1) * 3) # であり,4点の合計は # 4 * b * b - 6 * b + 6 # である. # 3 .. 1001 までの奇数を一辺の長さとして対角線上の各四点を合計 (n=1は初期値1として省略) puts 3.step(1001, 2).reduce(1) {|sum, b| sum + (4 * b * b - 6 * b + 6) }.to_i # e = 4 * b * b # f = 6 * b # g = 6 # とおけば,各数列の和をO(1)で計算できそうだけど,bが奇数列の場合のeが分からない..