ブロックで作られた立体を覆い尽くすのに必要なブロックの個数を考える.例えば3×2×1の直方体の場合,22個のブロックにより覆い尽くすことができる.
さらに,直方体を覆い尽くしてできた立体をもう一度覆い尽くすのに必要なブロックの個数は46個,これをさらに覆い尽くすには78個,さらに層を追加するには118個のブロックが必要である.
何層目かを覆い尽くすのにn個のブロックが必要となる直方体のパターンの数をC(n)とする.例えばC(46)の場合,3*2*1の直方体の2層目の他,5*3*1,7*2*1,11*1*1の直方体の1層目を覆うために46個の立方体が必要であるため,C(46)=4となる.
C(n)=1000となる最小のnは何か.
解けるには解けたが計算が遅くて十分な探索範囲を設定できない.微妙な探索範囲を指定して1分.とても微妙.
limit <- 1e4*3 count <- numeric(limit) fn <- function(n) 2*(x*y + x*z + y*z) + 4*(n-1)*(x+y+z + n-2) x <- y <- z <- 1 repeat{ if(fn(1) > limit){ z <- y <- y + 1 if(fn(1) > limit){ z <- y <- x <- x + 1 if(fn(1) > limit){ break } } } a <- sum(x, y, z) nlimit <- floor((sqrt(a^2 - 2*a - fn(1) + limit + 1)-a+3)/2) if(nlimit >= 2) count[fn(1:nlimit)] <- count[fn(1:nlimit)] + 1 z <- z + 1 } min((1:limit)[count==1000])