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)

// Aizu Vol0 0056: Goldbach's Conjecture
// 2017.7.30

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

char *gets(char *);

#define MAX  50000
#define SQRT 223     // sqrt(MAX)
#define HALF 25000

char table[MAX + 5];
int combi[MAX + MAX];

int main()
{
	int i, n;
	char buf[100];
	char *p, *p2, *pmax;
	int *q;
	
	pmax = table + MAX;
	for (p = table + 2, i = 2; i <= SQRT; p++, i++) {
		if (!*p) {
			for (p2 = p + i; p2 <= pmax; p2 += i) *p2 = 1;
		}
	}
	combi[4] = 1;
	for (p = table + 3, q = combi + 5; p < pmax; p+=2, q+=2) {
		if (!*p) *q = 1;
	}
	for (i = 3, p = table + 3; i < HALF; i+=2, p+=2) {
		if (!*p) {
			for (p2 = p, q = combi+i+i; p2 < pmax; p2+=2, q+=2) {
				if (!*p2) (*q)++;
			}
		}
	}
#if 0
	for (i = 2; i < 200; i++) printf("[%d]=%d\n", i, combi[i]);
#endif

	while (1) {
		gets(buf);
		n = atoi(buf);
		if (n == 0) break;
		printf("%d\n", combi[n]);
	}
	return 0;
}