如果是求一个数字的欧拉函数,可以在时间复杂度为O(sqrt(n))求出。但是如果要求前n个数的欧拉函数,按照上述的思路,时间复杂度就是O(n*sqrt(n))。
因此采用一种线性时间的方法筛选欧拉函数值,完成打表。
本方法需要一下的几个性质:
(p为质数)
1.phi[p]=p-1,因为1-p中只有p与本身不互质。
2.如果i mod p = 0,则 phi[i*p] = p *phi[i] 。
3.如果i mod p != 0,则 phi[i*p] = (p-1) *phi[i] 。
下面给出欧拉函数的线性筛选代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
#define maxn 1000000+5 //1e6+5
using namespace std;
int phi[maxn];
void get_phi()
{
memset(phi,0,sizeof(phi));
phi[1] = 1;
for(int i=2;i<=maxn;i++)
{
if(!phi[i])
for(int j=i;j<=maxn;j+=i)
{
if(!phi[j])
phi[j] = j;
phi[j] = phi[j]/i*(i-1);//先除再乘
}
}
}