欧拉筛板子

造数组时间复杂度:O(n)

查询:O(1)

这里计数是从0开始的(质数)

#include<iostream>
using namespace std;
const int N=100000010;
bool nums[N];
long long f[N],cot=0;

int main(){
	nums[1]=true;//1不是素数 true不是素数
	long long n=1e8;
    for(long long i=2;i<=n;i++)
    {
        if(!nums[i])
            f[cot++]=i;
        for(long long j=0;j<cot&&i*f[j]<=n;j++)
        {
            nums[f[j]*i]=true;
            if(i%f[j]==0)
                break;
        }
    }
	return 0;
}

### 欧拉算法的实现与应用 #### 欧拉算法简介 欧拉算法是一种高效的选素数的方法,具有线性时间复杂度 O(n) 和空间复杂度 O(n)[^1]。该算法不仅用于数学领域中的素数查找和数论研究,在计算机科学尤其是密码学中也扮演重要角色,例如 RSA 加密算法依赖于大素数的生成。 #### 欧拉算法的具体实现 下面展示了一个典型的 C++ 实现方式来说明如何通过欧拉找到给定范围内所有的素数: ```cpp const int N = 1e8 + 10; bitset<N> st; // 使用 bitset 来表示布尔类型的数组;0 表示素数, 1 表示合数 int primer[N]; // 存储质数的数组 inline int set_primer(int n) { int k = 0; // 记录已发现的素数数量 for (int i = 2; i <= n; ++i) { if (!st[i]) primer[++k] = i; // 如果当前数未被标记,则为素数并存入 primer 数组 for (int j = 1; primer[j] && i * primer[j] <= n; ++j) { st[i * primer[j]] = true; // 将所有非素数标记为 true if (i % primer[j] == 0) break; // 关键优化点:一旦遇到因子即停止循环 } } return k; } ``` 此代码片段展示了完整的欧拉过程,其中 `primer` 数组用来保存所得到的所有素数,而 `st` 则是一个位图结构,用于快速判断某个整数是否已经被确认不是素数[^3]。 #### 应用场景举例 在实际编程竞赛或其他高性能计算环境中,当需要频繁查询大量数据集内的素数状态时,可以预先利用欧拉预处理好一定区间内全部可能成为候选解的空间,从而极大提高后续操作效率。此外,在构建基于公钥基础设施的安全通信协议里,如RSA加密方案的设计过程中,也需要借助此类高效算法迅速获取足够长度的大素数作为基础构件之一[^2]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值