//Meisell-Lehmer
#include<cstdio>
#include<cmath>
using namespace std;
#define LL long long
const int N = 5e6 + 2;
bool np[N];
int prime[N], pi[N];
int getprime()
{
int cnt = 0;
np[0] = np[1] = true;
pi[0] = pi[1] = 0;
for(int i = 2; i < N; ++i)
{
if(!np[i]) prime[++cnt] = i;
pi[i] = cnt;
for(int j = 1; j <= cnt && i * prime[j] < N; ++j)
{
np[i * prime[j]] = true;
if(i % prime[j] == 0) break;
}
}
return cnt;
}
const int M = 7;
const int PM = 2 * 3 * 5 * 7 * 11 * 13 * 17;
int phi[PM + 1][M + 1], sz[M + 1];
void init()
{
getprime();
sz[0] = 1;
for(int i = 0; i <= PM; ++i) phi[i][0] = i;
for(int i = 1; i <= M; ++i)
{
sz[i] = prime[i] * sz[i - 1];
fo
求n很大时求,<= n的素数的个数(时间复杂度o(n ^ 2 / 3)模板
最新推荐文章于 2021-05-22 22:05:17 发布
这篇博客介绍了Meisell-Lehmer算法,用于在大数范围内高效计算小于等于n的素数个数。通过初始化、预处理和递归计算过程,实现了O(n^2/3)的时间复杂度。代码实现中包含关键函数如`getprime()`、`sqrt2()`、`sqrt3()`和`getphi()`,并在`main()`函数中展示了输入n输出相应素数个数的示例。
摘要由CSDN通过智能技术生成