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 JAVA (judge verdict: Time Limit Exceeded)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;

class Main {

    public static void main(String[] args) throws IOException {
        doit(args, System.in, System.out);
    }

    static void doit(String[] args, InputStream in, PrintStream out)
            throws IOException {
        int[] primes = new int[5133];
        fillPrimes(primes, 50000);

        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        while (true) {
            int n = Integer.parseInt(reader.readLine());
            if (n == 0) {
                break;
            }
            int result = 0;
            int h = n / 2;
            for (int i = 0; i < primes.length; i++) {
                int p = primes[i];
                if (p > h) {
                    break;
                }
                for (int j = i; j < primes.length; j++) {
                    int sum = p + primes[j];
                    if (sum > n) {
                        break;
                    } else if (sum == n) {
                        result++;
                        break;
                    }
                }
            }
            out.println(result);
        }
    }

    private static int fillPrimes(int[] primes, int n) {
        boolean[] sieve = new boolean[n + 1];
        int k = (int) Math.sqrt(n);
        int i = 0;
        for (int p = 2; p <= n; p++) {
            if (sieve[p]) {
                continue;
            }
            primes[i++] = p;
            if (p <= k) {
                for (int q = p * 2; q <= n; q += p) {
                    sieve[q] = true;
                }
            }
        }
        return i;
    }
}