#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<cmath>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=1e7+5;
const int MOD=1e9+7;
bool check[MAXN];
int phi[MAXN];
int prime[MAXN];
int tot;//素数的个数
void phi_and_prime_table(int N)
{
memset(check,false,sizeof(check));
phi[1]=1;
tot=0;
for(int i=2;i<=N;i++)
{
if(!check[i])
{
prime[tot++]=i;
phi[i]=i-1;
}
for(int j=0;j<tot;j++)
{
if(i*prime[j]>N) break;
check[i*prime[j]]=true;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}else
{
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
}
int main()
{
int n;
scanf("%d",&n );
phi_and_prime_table(n);
for(int i=1;i<=n;i++)
cout<<"i: "<<i<<" "<<phi[i]<<endl;
cout<<"---------"<<endl;
cout<<"tot: "<<tot<<endl;
for(int i=0;i<tot;i++)
{
cout<<prime[i]<<endl;
}
return 0;
}
线性筛(同时得到欧拉函数和素数表)
最新推荐文章于 2025-03-22 10:39:11 发布