Time Limit: 2 second(s) | Memory Limit: 32 MB |
Goldbach's conjecture is one of the oldest unsolved problemsin 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 forintegers 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 casenumber and the number of ways you can express n as sum of two primes. Tobe more specific, we want to find the number of (a, b) where
1) Both aand b are prime
2) a + b= n
3) a ≤b
Sample Input | Output for Sample Input |
2 6 4 | Case 1: 1 Case 2: 1 |
Note
1. Aninteger is said to be prime, if it is divisible by exactly two differentintegers. First few primes are 2, 3, 5, 7, 11, 13, ...
题意:给你一个偶数n,问有多少种方案找到两个数a,b,且a+b=n,a<=b,a和b是素数
思路:直接打个表就行了,然后暴力验证,但是用int来标记数会超内存,所以说改成bool就好了
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn = 1e7+5;
bool prim[maxn];
int primes[700000], p;
void init()
{
for(int i = 2; i < maxn; i++)
if(!prim[i])
{
primes[p++] = i;
for(int j = i+i; j < maxn; j += i)
prim[j] = true;
}
}
int main()
{
init();
int n, T;
scanf("%d", &T);
for(int kase =1; kase <= T; kase++)
{
scanf("%d", &n);
int ans = 0;
for(int i = 0; primes[i] <= n/2; i++)
{
if(!prim[n-primes[i]])
ans++;
}
printf("Case %d: %d\n", kase, ans);
}
return 0;
}