题意:问1个偶数n有几个素数和形式。例如给出偶数c,c = a + b ,a和b都是素数且a<=b,有几种组合方式。
题解:欧拉筛
1.埃氏筛是O(n*logn),欧拉筛在埃氏筛的基础上标记了一下,复杂度降低到了O(n)。
2.欧拉筛讲解和模板在代码中。
#include<stdio.h>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<vector>
#define inf 0x3f3f3f3f
using namespace std ;
int prime[1000010] ; //prime[i]存储的是第i个素数
bool vis[10000010] ; //vis[i] = 0表示i是素数 ,同时起标记作用,缩短时间。
int num = 0 ;
void Euler() //欧拉筛法
{
long long i , j , k ;
memset(prime , 1 , sizeof(prime)) ;
memset(vis , 0 , sizeof(vis)) ;
for(i = 2 ; i <= 10000005 ; i ++)
{
if(vis[i])
continue ;
prime[num ++] = i ;
for(j = 2 ; j * i <= 10000005 ; j ++)
vis[j * i] = 1 ;
}
}
int find(int x)
{
int i , j ;
int ans = 0 ;
for(i = 0 ; i < num && prime[i] <= x ; i ++)
if(!vis[x - prime[i]] && prime[i] <= x / 2)
ans ++ ;
return ans ;
}
int main()
{
int t , n , x ;
int i , j , k ;
int cnt = 0 ;
int ans ;
Euler() ;
scanf("%d" , &t) ;
while(t --)
{
scanf("%d" , &n) ;
ans = find(n) ;
printf("Case %d: %d\n" , ++cnt , ans) ;
}
}