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)

using System;
using System.Collections.Generic;
using System.Linq;

namespace AOJ0056
{
    class Program
    {
        static void Main()
        {
            var primeTable = GeneratePrimeTable(50100);

            foreach (var n in ReadInput())
            {
                var count = 0;

                var position1 = 0;
                var position2 = 0;
                for (; primeTable[position2] < n; position2++)
                {
                }

                while (true)
                {
                    int value;
                    for (; position1 <= position2 && (value = primeTable[position1] + primeTable[position2]) >= n; position2--)
                    {
                        if (value == n) count++;
                    }

                    for (; position1 <= position2 && (value = primeTable[position1] + primeTable[position2]) <= n; position1++)
                    {
                        if (value == n) count++;
                    }

                    if (position1 > position2) break;
                }

                Console.WriteLine(count);
            }
        }

        public static IEnumerable<int> ReadInput()
        {
            string line;
            while ((line = Console.ReadLine()) != null && line != "0")
            {
                yield return int.Parse(line);
            }
        }

        private static int[] GeneratePrimeTable(int max)
        {
            var primeTable = new bool[max + 1];

            for (var i = 2; i <= max; i++)
            {
                primeTable[i] = true;
            }

            for (var i = 4; i <= max; i += 2)
            {
                primeTable[i] = false;
            }

            var currentPrime = 3;
            while (currentPrime <= max)
            {
                for (var i = currentPrime * 2; i <= max; i += currentPrime)
                {
                    primeTable[i] = false;
                }

                for (currentPrime += 2; currentPrime <= max; currentPrime += 2)
                {
                    if (primeTable[currentPrime]) break;
                }
            }

            return (from n in Enumerable.Range(0, max + 1)
                    where primeTable[n]
                    select n).ToArray();
        }
    }
}