CodeIQ 「ルート・パワー」問題
CodeIQ の @riverplus さん出題の問題。
の有理数の項を求めよというもの。
他の方のコードが http://togetter.com/li/911507 にある。
とすると、求める数 F(n) は
を解に持つ方程式
を頑張って展開すると
になるから、F(n) は差分方程式
を満たす。
なので、
とすれば
だから
は直接計算して
になる。
下は提出したコードを修正したもの。言語は Ruby。
require 'matrix' def mod_pow(a, n) x = Matrix.I(8) loop do x = (x * a).map {|y| y % Mod} if n.odd? return x if (n >>= 1) == 0 a = (a ** 2).map {|y| y % Mod} end end def init_mat 8.times.map do |i| if i < 7 then 8.times.map {|j| j == i + 1 ? 1 : 0} else [71, -744, -580, 664, 178, -184, 12, 8] end end end Mod = 10 ** 7 a = Matrix[*init_mat] v = Vector[1, 1, 11, 31, 285, 1221, 9671, 51171] p (mod_pow(a, gets.to_i) * v)[0] % Mod