Problem:
ゴールドバッハの予想

4 以上の偶数は 2 つの素数の和で表すことができるということが知られています。これはゴールドバッハ予想といい、コンピュータの計算によりかなり大きな数まで正しいことが確かめられています。例えば、10 は、7 + 3、5 + 5 の 2 通りの素数の和で表すことができます。

整数 n を入力し、n を 2 つの素数の和で表す組み合わせ数が何通りあるかを出力するプログラムを作成してください。ただし、n は 4 以上、50,000 以下とします。また、入力される n は偶数であるとはかぎりません。

Input

複数のデータセットが与えられます。各データセットに n が１行に与えられます。n が 0 のとき入力の最後とします。データセットの数は 10,000 を超えません。

Output

各データセットに対して、n を 2 つの素数の和で表す組み合わせ数を１行に出力して下さい。

Sample Input

10
11
0

Output for the Sample Input

2
0

Solution in Haskell (judge verdict: Time Limit Exceeded)

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

main :: IO ()
main = do
  n <- getl toInt
  when (n /= 0) $ do
    print $ solve n
    main
  
solve :: Int -> Int
solve x = length $ f [] cs rcs
  where
    pns = 2 : sieve [3,5..]
    cs = takeWhile (<= x) pns
    rcs = reverse cs
    f :: [Int] -> [Int] -> [Int] -> [Int]
    f acc [] _ = acc
    f acc _ [] = acc
    f acc (n:ns) (m:ms) | n > m = acc
                        | n + m == x = f (n:acc) ns ms
                        | n + m < x = f acc ns (m:ms)
                        | n + m > x = f acc (n:ns) ms
sieve :: [Int] -> [Int]
sieve (p:ps) = p : [x | x <- sieve ps, x `mod` p /= 0]


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

getl :: (String -> a) -> IO a
getl f = f <$> getLine