zoukankan      html  css  js  c++  java
  • 欧拉筛欧拉函数

    欧拉函数

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

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

    fighting fighting fighting!!!

     

  • 相关阅读:
    一个好的技术管理人员需要知道的几件事
    团队必经的五个阶段以及好团队的七个特征
    作为CTO如何做技术升级
    技术领导画像
    TF-IDF原理
    KNN和K-Means的区别
    图数据库入门
    Hbase和Hive的异同
    谈谈机器学习面试
    关于领导力的理解
  • 原文地址:https://www.cnblogs.com/Frank-King/p/9936693.html
Copyright © 2011-2022 走看看