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

     

  • 相关阅读:
    CSS3实现轮播切换效果
    angularjs directive
    angularjs 迭代器
    anjularjs 路由
    sublime text3 快捷键设置
    如何使用git 跟进项目进程
    hdu 4842(NOIP 2005 过河)之 动态规划(距离压缩)
    叠箱子问题 之 动态规划
    华为oj 之 蜂窝小区最短距离
    华为oj 之 整数分隔
  • 原文地址:https://www.cnblogs.com/Frank-King/p/9936693.html
Copyright © 2011-2022 走看看