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

本文介绍了一种使用欧拉筛法解决偶数n可表示为两个素数之和的问题。通过实现欧拉筛算法,可以有效地找出所有小于等于10^7的素数,并利用这些素数来确定偶数n有多少种素数和的形式。文章提供了详细的代码实现和解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:问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) ;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值