Problem:
４つの整数の和 II

4,000 以下の正の整数 n を入力し、0 〜 1000 の範囲の整数 a, b, c, d の組で

a + b + c + d = n

を満たすものの組み合わせ数を出力するプログラムを作成して下さい。

Input

複数のデータセットが与えられます。各データセットに n が１行に与えられます。入力の最後まで処理して下さい。

データセットの数は 50 を超えません。

Output

各データセットごとに、a, b, c, d の組み合わせの個数を１行に出力して下さい。

Sample Input

2
3
35

Output for the Sample Input

10
20
8436

Solution in Haskell (judge verdict: Time Limit Exceeded)

import Control.Applicative ((<$>), (<*>))
import Control.Monad
import Data.List

main :: IO ()
main = mapM_ print =<< (map solve) <$> getc toInt

solve :: Int -> Int
solve x = (sum . map (count x 3)) [0..1000]

count :: Int -> Int -> Int -> Int
count s n i
  | n == 0 = if s == i then 1 else 0
  | s < i = 0
  | otherwise = (sum . map (count (s - i) (n - 1))) [0..1000]

toInt :: String -> Int
toInt s = read s

getc :: (String -> a) -> IO [a]
getc f = map f . lines <$> getContents