原文链接:https://blog.csdn.net/on_the_road344/article/details/45178243
对于正整数n,φ(n)是小于或等于n的正整数中,与n互质的数的数目;
欧拉函数就是用来求这个的。
公式: φ(x)=x(1-1/p(1))(1-1/p(2))(1-1/p(3))(1-1/p(4))…..(1-1/p(n)) 其中p(1),p(2)…p(n)为x 的所有质因数;x是正整数; φ(1)=1(唯一和1互质的数,且小于等于1)。注意:每种质因数只有一个。
有两种方法求,一种直接求,一种线性求。

1 //直接求解欧拉函数
2 int euler(int n){ //返回euler(n)
3 int res=n,a=n;
4 for(int i=2;i*i<=a;i++){
5 if(a%i==0){
6 res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出
7 while(a%i==0) a/=i;
8 }
9 }
10 if(a>1) res=res/a*(a-1);
11 return res;
12 }
13
14 //筛选法打欧拉函数表
15 #define Max 1000001
16 int euler[Max];
17 void Init(){
18 euler[1]=1;
19 for(int i=2;i<Max;i++)
20 euler[i]=i;
21 for(int i=2;i<Max;i++)
22 if(euler[i]==i)
23 for(int j=i;j<Max;j+=i)
24 euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出
25 }
来源:https://www.cnblogs.com/xiaobuxie/p/12244102.html
