欧拉筛欧拉函数

欧拉函数

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\n",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]]

还有一句非常重要的(对我来说很容易错。。):if (i*prim[j]>n) break  这句话不加,会出现未知错误。。。

 

 

fighting fighting fighting!!!

 

posted on 2018-11-09 19:02  Frank-King  阅读(188)  评论(0编辑  收藏  举报