欧拉筛(线性筛)和埃氏筛

埃氏筛素数

•埃氏筛法的基本思想 :从2开始,将每个质数的倍数都标记成合数,以达到筛选素数的目的。

inline ll getprime(ll n)
{
	ll k=0;
	
	memset(prime,0,sizeof(prime));	//prime中存放2~n的质数;
	memset(vis,0,sizeof(vis));		//vis标记0~n之内不是质数的数;
	
	ll m=sqrt(n+0.5);		//优化;
	vis[0]=vis[1]=1;
	
	for(int i=2;i<=m;i++)
	    if(!vis[i])
	 	  {
	 	  	prime[k++]=i;
	 	  	
	 	  	for(int j=i*i;j<=n;j+=i)
	 	  	   vis[j]=1;
			} 
	 	
	for(int i=m+1;i<=n;i++)
	  if(!vis[i])
	    prime[k++]=i;


return k;

}

欧拉筛素数(线性筛)

•欧拉筛法的基本思想 :在埃氏筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的。


inline void getprime(ll n)
{
	 
	 memset(prime,0,sizeof(prime));
	 memset(vis,0,sizeof(vis));
	 
	 vis[0]=vis[1]=1;
	 
	for(int i=2;i<=n;i++)
	 {
	 	if(!vis[i])
	    prime[++prime[0]]=i;		//纪录素数, 这个prime[0] 相当于 cnt,用来计数,即prime数组的总个数便是prime【0】;

	 	for(int j=1;j<=prime[0] && i*prime[j]<=n;j++)	//循环prime数组里的素数;
	 	   {
	 	   		vis[i*prime[j]]=1;		//用prime里面纪录的素数,升序来当做要消去合数的最小素因子。
	 	   		
	 	   		if(i%prime[j]==0)		
	 	   		  		break;			//防止重复筛查;
			 } 
	 	    
	 	
	 }
	    
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值