これを書いている時点でAtCoderのHaskell処理系はGHC 7.4であり、これはプログラムに対してデフォルトで8MBのスタック制限を課す。したがって、深さ数十万の再帰を普通に書くと容易にスタック溢れによるREを起こす。 このスタック制限値はコンパイル時または実行時にRTSの-Kオプションで変更できるが、AtCoderではGHCにも自分のプログラムにも好きなオプションを渡すことが基本的にはできない*1ので、他の方法を考える。 回避策 以下のコードをコピペした上で、mainの先頭でunlimitStackSizeを呼べば良い。 import Control.Monad import Data.Word import Foreign.Ptr import Foreign.Storable -- | Remove the stack size limit in the RTS (+RTS