cqbz笔记补全计划1-筛质数

这篇博客介绍了CQBZ笔记补全计划的第一部分,主要聚焦于筛质数的方法。文章详细讲解了暴力法(O(sqrt(n)))、埃筛以及欧拉筛(线性筛)的原理,并提供了相关代码实现。通过实例说明了在算法竞赛中选择合适的筛法对于避免超时(TLE)的重要性。
摘要由CSDN通过智能技术生成

cqbz笔记补全计划1

筛质数

在OI赛中,我们经常需要筛质数的题,这个时候选择什么筛法之冠重要(避免TLE)

法1 暴力(O(sqrt(n)))

bool pzs(int n)//判断n为合数或质数,1为合数,0为质数
{
	if (n<2)retrun 1;
	for (int i=2;i*i<=n;i++)if(n%i==0)return 1;
	return 0;
}

法2 埃筛

该筛法的核心思想是此数若未被筛,则为质数,筛为合数,筛去此数与所有以找到质数之几。

代码

#include<bits/stdc++.h> 
using namespace std;
bool pzs[1000005];
int zs[1000005],n;
int main ( )
{
	cin>>n; 
	for (int i=2;i<=n;i++)
	{
		if (pzs[i]==0)
		{
			zs[0]++;
			zs[zs[0]]=i;
		}
		for (int j=1;j<=zs[0];j++)pzs[zs[j]*i]=1;
	}
	for (int i=1;i<=zs[0];i++)cout<<zs[i]<<" ";
}

该程序是求1~n之间的质数,但是,不是最好方法,如43,62,
12被筛了两次。

法3 欧拉筛(线性筛)

该筛法是在埃筛的基础上加以改进,总所周知,任何一个数都只有一个最小质因数,所以,只用最小质因数筛。

代码

#include<bits/stdc++.h>
using namespace std;
bool pzs[1000005];
int zs[1000005],n;
int main ( )
{
   cin>>n;
   for (int i=2;i<=n;i++)
   {
   	if (pzs[i]==0)
   	{
   		zs[0]++;
   		zs[zs[0]]=i;
   	}
   	for (int j=1;j<=zs[0];j++)
   	{
   		pzs[zs[j]*i]=1;
   		//如果i含有第j大的质因数分子,则不必枚举,因为该质数以筛去 
   		if (i%zs[j]==0)break;//有人认为,该句应该在16行之前,举个反例:2*2=4 
   	}
   }
   for (int i=1;i<=zs[0];i++)cout<<zs[i]<<" ";
}


































































并没有完:

实列:

1.某位鸣叫FXL特殊的质数肋骨是使用欧拉筛,然后TLE。我暴力分解BFS,AC。这就是为什么选择对很重要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值