线性筛选欧拉函数

来源:互联网 发布:温州网络学堂手机版 编辑:程序博客网 时间:2024/06/08 12:03

如果是求一个数字的欧拉函数,可以在时间复杂度为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+5using 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);//先除再乘               }       }}
0 0
原创粉丝点击