#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
int eular[maxn],prime[maxn],top=0;
bool isprime[maxn];
void get_eular()
{
eular[1]=1;
for (int i=2; i<=maxn; i++)
{
if (!isprime[i])//i为素数
{
prime[++top]=i;//将i加入素数数组prime中
eular[i]=i-1;//因为i是素数,由特性得知
}
for (int j=1; j<=top&&prime[j]*i<=maxn; j++) //用当前已得到的素数数组p筛,筛去p[j]*i
{
isprime[prime[j]*i]=1;//可以确定i*prime[j]不是素数
if (i%prime[j]==0) //看prime[j]是否是i的约数,因为素数prime[j],等于判断i和prime[j]是否互质
{
eular[prime[j]*i]=eular[i]*prime[j]; //特性2
break;
}
else
eular[prime[j]*i]=eular[i]*(prime[j]-1); //互质,特性3,prime[j]-1就是eular[prime[j]]
}
}
}
int main()
{
get_eular();
for(int i=1;i<=20;i++)
{
printf("%d ",eular[i]);
}
return 0;
}
欧拉筛法求欧拉函数
最新推荐文章于 2023-08-16 15:05:42 发布