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 C (judge verdict: Accepted)

#include <stdio.h>          // printf(), scanf()
#include <stdbool.h>

#define MAX_N 50000
#define MAX_SQRT_N 224
#define MAX_P 5140

bool f[MAX_N + 1];
int count[MAX_N + 1];
int primes[MAX_P];
int np;

int
main(int argc, char **argv)
{
	int i, j;

	for (i = 0; i <= MAX_N; ++i)
		f[i] = true;

	for (i = 2; i <= MAX_SQRT_N; ++i)
	{
		if (f[i])
		{
			for (j = i + i; j <= MAX_N; j += i)
				f[j] = false;
		}
	}

	np = 0;
	for (i = 2; i <= MAX_N; ++i)
	{
		if (f[i])
			primes[np++] = i;
	}

	for (i = 0; primes[i] <= MAX_N / 2; ++i)
	{
		for (j = i; primes[i] + primes[j] <= MAX_N; ++j)
			count[primes[i] + primes[j]]++;
	}

	while (true)
	{
		int n;
		scanf("%d", &n);
		if (n == 0)
			break;

		printf("%d\n", count[n]);
	}

	return 0;
}