欧拉筛欧拉函数

Posted frank-king

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了欧拉筛欧拉函数相关的知识,希望对你有一定的参考价值。

欧拉函数

phi[i]表示 1~i 内与 i 互质的个数

通式:phi[i]=x∏(1-pi)  pi表示 i 的质因数

是积性函数 phi[i]*phi[j]=phi[i*j]

做法:一般用欧拉筛

先贴一份代码:

技术分享图片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 bool vis[100];
 7 int phi[100],prim[100],tot; 
 8 int main()
 9 {
10     int n=100;
11     for (int i=2; i<=n; ++i)
12     {
13         if (!vis[i]) {
14             prim[++tot]=i;
15             phi[i]=i-1;
16         }
17         for (int j=1; j<tot; ++j)
18         {
19             if (i*prim[j]>n) break;
20             vis[i*prim[j]]=1;
21             if (i%prim[j]==0)
22             {
23                 phi[i*prim[j]]=phi[i]*prim[j];
24             }
25             else phi[i*prim[j]]=phi[i]*phi[prim[j]];
26         }
27     }
28     for (int i=2; i<=n; ++i)
29       printf("%d %d
",i,phi[i]);
30     return 0;
31 }
View Code

 

 

素数筛法还是一样没变,重要的是算 phi 函数。

首先如果 i%prim[j]==0 ,即 i 包含prim[j],则 prim[j] 的质因数都是 i 的质因数。

那么 i 的每一个质因数 phi[i] 个,可跟 1~prim[j] 一一配对;

对于i%prim[j]!=0 则利用积性函数性质,可得 phi[i]*phi[prim[j]]=phi[i*prim[j]]

 

 

 

fighting fighting fighting!!!

 


以上是关于欧拉筛欧拉函数的主要内容,如果未能解决你的问题,请参考以下文章

欧拉筛线性处理莫比乌斯函数

欧拉函数 欧拉筛法

线性(欧拉)筛&欧拉函数

欧拉筛 + 欧拉函数

欧拉筛转载自用

欧拉筛素数+求欧拉函数