Problem:
ゴールドバッハ予想

ゴールドバッハ予想とは「6 以上のどんな偶数も、2 つの素数 (*1) の和として表わすことができる」というものです。

たとえば、偶数の 12 は 12 = 5 + 7 、18 は 18 = 5 + 13 = 7 + 11 などと表すことができます。

和が 134 となる 2 つの素数の組み合せをすべて書き出すと、以下の通りとなります。

134 = 3+131 = 7+127 = 31+103 = 37+97 = 61+73 = 67+67

= 131+3 = 127+7 = 103+31 = 97+37 = 73+61

与えられた数が大きくなると、いくらでも素数の組み合せが見つかるような気がします。しかし、現代数学をもってしてもこの予想を証明することも、反例を作ることもできません(*2)。ちょっと不思議な感じがしますね。

そこで、ゴールドバッハ予想を鑑賞するために、偶数 n を入力とし、和が n となる 2 つの素数の組み合せの数を求めるプログラムを作成してください。

和が n となる素数の組み合せの数とは n = p + q かつ p ≤ q であるような正の素数 p, q の組み合せの数です。上の例からわかるように和が 134 となる素数の組み合せは6 個です。

(*1) 素数とは、1 または自分自身以外に約数を持たない整数のことである。なお、1 は素数ではない。

(*2) 2007 年 2 月現在、5×1017 までの全ての偶数について成り立つことが確かめられている。(Wikipedia)

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。 各データセットとして、１つの偶数 n (6 ≤ n ≤ 1000000) が１行に与えられます。

データセットの数は 500 を超えません。

Output

データセット毎に素数の組み合せの数を１行に出力します。

Sample Input

134
4330
34808
98792
0

Output for the Sample Input

6
72
274
607

Solution in C++ (judge verdict: Time Limit Exceeded)

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
bool us[1000010]={false};
int p[1000010] = {0};
int main(){
	/*Eratosthenes*/
	p[0] = 2;
	for(int i = 0; i <= 1000010; i+=2){
		us[i] = true;
	}
	
	int cnt = 1;
	for(int i = 3; i <= 1000010; i+=2){
		int q = 0;
		if(us[i] == true)continue;
		else if(us[i] == false){
			p[cnt] = i;
			cnt++;
			us[i] = true;
			q = i;
			for(int j = q+q; j <= 1000010; j += q){
				us[j] = true;
			}
		}
	}
	
	int n;
	while(scanf("%d",&n),n){
		int x = 0;
		memset(us,false,sizeof(us));
		for(int i = 0; i < n/2; i++){
			if(us[i] == true)continue;
			if(us[i] >= n)break;
			for(int j = i; j < n/2; j++){
				if(p[i] + p[j] > n)break;
				if(p[j] == true){
					if(p[i] +p[j] < n)continue;
					else break;
				}
				if(binary_search(p,p + (n/2),(n-p[i]))){
					x++;
					us[i] = true;
					us[j] = true;
					break;
				}
			}
		}
		printf("%d\n",x);
	}
	return 0;
}