Project Euler 256(2)

プロジェクトオイラー
http://projecteuler.net/index.php?section=problems&id=256


ゴールが見えていて(純粋にプログラミングの問題になって)これだけ苦しめられたのは、どの問題以来だっただろうか。

昨夜寝ながら考えていて(寝不足になった)、畳を敷き詰められない部屋の大きさ(縦横)には恐らく簡単な法則があるのだろう、と思った。今朝起きてから小さな部屋で確認すると、想像通り簡単な法則が見つかった。

もう解けたも同然だと思った。しかし、難しいのはここからだった。部屋の縦横さえわかれば畳を敷き詰められるかの判定は簡単だが、素因数分解に時間がかかるので部屋の大きさだけわかってもT(s)はなかなか求まらない。ここで方針を転換し、約数が399以上ある自然数を求めることにした。しかし、題意を満たす最も小さい部屋のサイズを求めなければならない。このためになるべくうまく上から押さえなければならない。これには苦労した。結局、美しくないが、まず一つのアルゴリズムで題意を満たす部屋のサイズを一つ求めて、またそれを手がかりに別のアルゴリズムで求めるという、2段構えの方策を取った。
あとから考えると、答えは意外と小さな数だったので、(メモリの関係から)部分的なエラトステネスのふるいを使って1から順に求めるほうが、スピードは遅くても、コーディングは簡単だったかもしれない。


24番目の正答者だったようだ。もう丸1日以上経っているのにこれだけ正答者が少ないとは、かなりの難問なのだろう。