码迷,mamicode.com
首页 > 其他好文 > 详细

欧拉筛欧拉函数

时间:2018-11-09 20:54:41      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:个数   include   view   hid   cst   欧拉   int   bsp   std   

欧拉函数

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]]

 

 

 

fighting fighting fighting!!!

 

欧拉筛欧拉函数

标签:个数   include   view   hid   cst   欧拉   int   bsp   std   

原文地址:https://www.cnblogs.com/Frank-King/p/9936693.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!