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: Time Limit Exceeded)

#include <stdio.h>
#include <stdlib.h>

char flag[50001] = { 1, 1 };
unsigned int primes[50001], top = 0;
unsigned int match[1000], mtop = 0;
unsigned int count = 0;

void init() {
  unsigned int i, j;
  for (i = 2; i < 225; i++)
    if (!flag[i])
      for (j = i + 1; j < 50001; j++)
	if (!flag[j] && !(j % i))
	  flag[j] = 1;
  for (i = 0; i < 50001; i++)
    if (!flag[i]) primes[top++] = i;
}

int coupled(unsigned int a, unsigned int b) {
  int i;
  for (i = 0; i < mtop; i++) {
    if (match[i] == a || match[i] == b) return 1;
  }
  return 0;
}

int init2() {
  int i;
  for (i = 0; i < top; i++) { if (primes[i] > 25000) break; }
  return i;
}
int main() {
  unsigned int n, top2;
  init();
  top2 = init2();
  while (scanf("%u", &n), n) {
    unsigned int i, j, k;
    mtop = count = 0;
    if (n == 4 && puts("1")) continue;
    if (n & 1 && printf("%d\n", !flag[n + 1] + !flag[n - 1])) continue;
    for (i = 0; i < top2; i++) {
      for (j = top; j; j--) {
	if (primes[i] + primes[j] == n && !coupled(primes[i], primes[j])) {
	  match[mtop++] = primes[i];
	  count++;
	}
      }
    }
    printf("%d\n", count);
  }
  return 0;
}