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>

int b_search(int bottom, int top, int x, int array[]) {
	int mid = (bottom + top) / 2;

	do {
		if(array[mid] == x)
			return mid;

		else if(array[mid] > x)
			top = mid;
		else
			bottom = mid;

		mid = (bottom + top) / 2;
	} while(mid != bottom);

	if(array[mid] == x)
		return mid;
	
	return -1;
}

int main() {
	int prime[60000] = {1, 1};
	int prime_num[10000] = {0};
	int num;
	int i, j;
	int n;
	int ans;
	int temp;

	for(i = 2; i < 60000; i++)
		if(!prime[i])
			for(j = 2; i * j < 60000; j++)
				prime[i * j] = 1;

	for(i = 0, num = 0; i < 60000; i++) {
		if(!prime[i]) {
			prime_num[num] = i;
			num++;
		}
	}

	while(1) {
		ans = 0;
		scanf("%d", &n);
		if(n == 0)
			break;
		
		if(n % 2 == 1) {
			if(b_search(0, num, n - 2, prime_num) >= 0)
				ans++;
		}

		else {
			for(i = 0; prime_num[i] * 2 <= n; i++) {
				if(b_search(0, num, n - prime_num[i], prime_num) >= 0) {
					ans++;
				}
			}
		}

		printf("%d\n", ans);
	}

	return 0;
}