• 欧拉函数 欧拉筛 【数学】


    欧拉系列

    欧拉函数:phi(i)表示   1~i 中与 i 互质的数的个数。

    利用这个定义就可以在筛素数的同时,求出欧拉函数。

    设 欧拉函数 为 phi(x) , p 为素数:

    1、如果 i % p == 0  ,那么  phi (i*p) =  phi (i) * p。

    显然,与 i 互质的每一个数都与 i*p 互质。

    2、如果 i % p != 0 , 那么  phi (i*p) = phi (i) * (p-1) 。

    因为 i 与 p 互质,根据积性函数的性质,得 phi(i*p) = phi(i) * phi(p)。

    又因为 p 是质数,所以 phi(p) = p-1;

    这样一来欧拉筛就成型了:

    这里贴一道模板题: BZOJ 2190 仪仗队

    代码:

     1 #include<bits/stdc++.h>
     2 #define N 40005
     3 using namespace std;
     4 int n;
     5 int f[N],prime[N],tot,ans;
     6 bool vis[N];
     7 inline void doingpre()
     8 {
     9     f[1]=1;
    10     for (int i=2; i<=n; i++)
    11     {
    12         if (!vis[i])
    13         {
    14             prime[++tot]=i; f[i]=i-1;
    15         }
    16         for (int j=1; j<=tot; j++)
    17         {
    18             if (i*prime[j]>N) break;
    19             vis[i*prime[j]]=1;
    20             if (i%prime[j]==0)
    21             {
    22                 f[i*prime[j]]=f[i]*prime[j]; break;
    23             }
    24             else f[i*prime[j]]=f[i]*(prime[j]-1);
    25         }
    26     }
    27 }
    28 int main()
    29 {
    30     scanf("%d",&n);
    31     doingpre();
    32     for (int i=1; i<n; i++)
    33       ans+=f[i];
    34     printf("%d",2*ans+1);
    35     return 0;
    36 }
    View Code

    加油加油加油!!!fighting fighting fighting!!!

  • 相关阅读:
    UVA 11354
    HDU 4081 Qin Shi Huang's National Road System 最小/次小生成树的性质
    UVA 10269 Adventure of Super Mario floyd dp
    UVA 11280 Flying to Fredericton 最短路DP
    【专题】树状数组
    【专题】Subsequence
    共享python代码模块
    完全背包
    POJ 3253 Fence Repair
    POJ 3069 Saruman's Army
  • 原文地址:https://www.cnblogs.com/Frank-King/p/9498463.html
Copyright © 2020-2023  润新知