# -*- coding: utf-8 -*- # http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%20357 # # 条件より # 1 + n / 1 # が素数でなければならないので,n が 1以外のとき,n は偶数である. # また,素因数 p の指数 c が1以外の場合は # d + n / d # が合成数になるため,条件にあう n の素因数の指数は全て1である. # # 上記より, # - n は偶数とする(1は見つかっていることにする) # - n は素数の2乗の倍数ではない(4や9の倍数ではない) # - 1 + n も素数である # など枝刈りの条件ができるので,それを使って..力で.. require 'prime' def dnd_prime?(n) if (n % 4 == 0) false elsif (n % 9 == 0) false elsif (n % 25 == 0) false elsif (!(n + 1).prime?) false elsif (n % 3 == 0 && !(3 + n / 3).prime?) false elsif (n % 5 == 0 && !(5 + n / 5).prime?) false elsif (n % 7 == 0 && !(7 + n / 7).prime?) false elsif (n % 11 == 0 && !(11 + n / 11).prime?) false else pd = n.prime_division unless (pd.reduce(true){|ret, d| ret && d[1] == 1}) false else a = pd.map {|a| a[0]} (1 ... a.size).map do |n| a.combination(n).map {|c| c.inject(:*)} end.flatten.reduce(true) {|ret, d| ret && (d + n / d).prime?} end end end puts 2.step(100000000, 2).reduce(1) {|sum, n| if (dnd_prime?(n)) sum + n else sum end }