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>
#include <stdlib.h>

#define MAX_N 50000

int p = 0;
int prime[MAX_N];
int is_prime[MAX_N + 1];

void eratosthenes() {
  int i, j;
  for (i = 0; i < MAX_N; i++) { is_prime[i] = 1; }
  is_prime[0] = is_prime[1] = 0;
  
  for (i = 2; i <= MAX_N; i++) {
    if (is_prime[i]) {
      prime[p++] = i;
      for (j = 2 * i; j <= MAX_N; j += i) { is_prime[j] = 0; }
    }
  }
}

int p_max(const int n) {
  int i;
  for (i = p - 1; i > 0 && prime[i] > n; i--);
  return i;
}

void solve(const int n) {
  int count = 0;
  int max = p_max(n/2+1);
  int i, j;
  
  /*
  for (i = 0; i <= max; i++) {
    for (j = i; j < p; j++) {
      if (prime[i] + prime[j] == n) {
        count++;
        // printf("%d + %d = %d\n", prime[i], prime[j], n);
      }
      if (prime[i] + prime[j] > n) break;
    }
  }
  */
  printf("%d\n", is_prime[n]);
}

void init() {
  int i, j, max = p_max(50000);
  for (i = 0; i < MAX_N; i++) is_prime[i] = 0;
  for (i = 0; i <= max; i++) {
    for (j = i; j < p; j++) {
      if (MAX_N >= prime[i] + prime[j]) is_prime[prime[i] + prime[j]]++;
    }
  }
}

int main(int argc, char argv) {
  int n;
  
  eratosthenes();
  init();
  while (scanf("%d", &n)) {
    if (0 == n) break;
    solve(n);
  }
  return 0;
}