欧拉筛欧拉函数
欧拉函数
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 }
素数筛法还是一样没变,重要的是算 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!!!