Goldbach`s Conjecture 【素数线性筛法】


Goldbach`s Conjecture
Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu
Submit  Status

Description

Goldbach's conjecture is one of the oldest unsolved problems in number theory and in all of mathematics. It states:

Every even integer, greater than 2, can be expressed as the sum of two primes [1].

Now your task is to check whether this conjecture holds for integers up to 107.

Input

Input starts with an integer T (≤ 300), denoting the number of test cases.

Each case starts with a line containing an integer n (4 ≤ n ≤ 107, n is even).

Output

For each case, print the case number and the number of ways you can express n as sum of two primes. To be more specific, we want to find the number of (a, b) where

1)      Both a and b are prime

2)      a + b = n

3)      a ≤ b

Sample Input

2

6

4

Sample Output

Case 1: 1

Case 2: 1



#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <ctype.h>
#include <time.h>
#include <queue>
#include <iterator>

using namespace std;

int t;
const int MAXN = 10000010;

bool com[MAXN];
int primes, prime[MAXN/10];//数组不必开的太大

void solve(int n)
{
	primes = 0;
	memset(com,false,sizeof(com));
	com[0] = com[1] = true;
	for (int i = 2; i <= n; ++i)
	{
		if (!com[i])
		{
			prime[++primes] = i;
		}
		for (int j = 1; j <= primes && i*prime[j] <= n; ++j)
		{
			com[i*prime[j]] = true;
			if (!(i % prime[j]))
				break;
		}
	}
}

int main()
{
	solve(10000000);
	int t, cases = 1, n;
	scanf("%d",&t);
	while (t--)
	{
		scanf("%d", &n);
		
		
		int ans = 0;
		for (int i = 1; prime[i] * 2 <= n; i++)//效率高
		{
			if (!com[n - prime[i]])
				ans++;
		}
		printf("Case %d: %d\n", cases++, ans);
	}
	return 0;
}



你可能感兴趣的:(Goldbach`s Conjecture 【素数线性筛法】)