欧拉筛法求素数
将所有合数标记,保证不被重复筛除,时间复杂度为O(n)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 3000050;
int prime[maxn];
int vis[maxn];
int Prime(int n) {
int cnt = 0;
memset(vis, 0, sizeof(vis));
for (int i = 2; i < n; i ++) {
if (!vis[i]) prime[cnt++] = i;
for (int j = 0; j < cnt && i * prime[j] < n; j ++) {
vis[i * prime[j]] = 1;
if (i % prime[j] == 0) break;
}
}
return cnt;
}
int main()
{
int n;
scanf("%d", &n);
int ans = Prime(n);
cout << ans << endl;
for (int i = 0; i < ans; i ++) {
cout << prime[i] << " ";
}
}
欧拉phi函数
根据上述函数定义式
可以得到一个在分解质因数时同时求解单个欧拉函数的方法
int phi(int x)
{
int res=x;
for(int i=2;i*i<=x;++i)
{
if(x%i==0)
{
res=res/i*(i-1);
while(x%i==0) x/=i;
}
}
if(x>1) res=res/x*(x-1);
return res;
}
/*
i 1 2 3 4 5 6 7 8 9 10
phi 1 1 2 2 4 2 6 4 6 4
*/