nlog(n)打表欧拉函数:
void Euler()
{
phi[1] = 1;
for(int i=2;i<N;i++)
{
if(!phi[i])
{
for(int j=i;j<N;j=j+i)
{
if(!phi[j])
phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
}
}
}
O(n)线性筛打表欧拉函数:
#include<cstdio>
using namespace std;
const int N = 1e6+10 ;
int phi[N], prime[N];
int tot;//tot计数,表示prime[N]中有多少质数
void Euler()
{
phi[1] = 1;
for(int i = 2; i < N; i ++)
{
if(!phi[i])
{
phi[i] = i-1;
prime[tot ++] = i;
}
for(int j = 0; j < tot && 1ll*i*prime[j] < N; j ++)
{
if(i % prime[j]) phi[i * prime[j]] = phi[i] * (prime[j]-1);
else
{
phi[i * prime[j] ] = phi[i] * prime[j];
break;
}
}
}
}
本文详细介绍了两种计算欧拉函数的算法:nlog(n)打表欧拉函数和O(n)线性筛打表欧拉函数。通过具体的代码实现,展示了如何高效地计算欧拉函数,适用于数学和计算机科学领域的读者。
427

被折叠的 条评论
为什么被折叠?



