Lightoj 比埃氏筛更快的欧拉筛法

题意:问1个偶数n有几个素数和形式。例如给出偶数c,c = a + b ,a和b都是素数且a<=b,有几种组合方式。

题解:欧拉筛

1.埃氏筛是O(n*logn),欧拉筛在埃氏筛的基础上标记了一下,复杂度降低到了O(n)。

2.欧拉筛讲解和模板在代码中。

#include
#include
#include
#include
#include
#include
#include
#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) ;
	}
}

 

你可能感兴趣的:(数论基础)