zoukankan      html  css  js  c++  java
  • 【poj2478-Farey Sequence】递推求欧拉函数-欧拉函数的几个性质和推论

    http://poj.org/problem?id=2478

    题意:给定一个数x,求<=x的数的欧拉函数值的和。(x<=10^6)

    题解:数据范围比较大,像poj1248一样的做法是不可行的了。

    首先我们要了解欧拉函数的几个性质和推论:(今天跟好基友Konjak魔芋讨论了好久。。)

     

    推论(一): phi(p^k)=(p-1)*p^(k-1)

          证明:

               令n=p^k,小于等于n的正整数数中,所有p的倍数共有p^k /p = p^(k-1)个。

              1~n出去p的倍数,所以phi(n)= n -  p^(k-1)  = p^k - p^(k-1) =  (p-1)*p^(k-1).得证。

      引用自scy的讲解。

    性质(一):若ab互质,则phi(a*b)=phi(a)*phi(b)。即:欧拉函数是积性函数.

    证明:

                对任意数n都可以唯一分解成n=p1^a1*p2^a2*p3^a3*...*pn^an(pi为素数).
                则E(n)=n*(1-1/p1)*(1-1/p2)*...*(1-1/pn)

                =(p1^a1*p2^a2*p3^a3*...*pn^an)*[(p1-1)*(p2-1)*(p3-1)*...*(pn-1)]/(p1*p2*p3*...*pn)      

                =(p1-1)*p1^(a1-1)*(p2-1)*p2^(a2-1)*...*(pn-1)*pn^(an-1)     ---(1)
                =E(p1^a1)*E(p2^a2)*E(p3^a3)*...*E(pn^an)   

                所以当ab互质的时候E(a*b)=E(a)*E(b)

        注明:E()即是phi()。

    推论(二):当b是质数,a%b==0,phi(a*b)=phi(a)*b

        这个的证明可以代入到上面性质一的证明之中:

        b=gcd(a,b),指数为q。

        在(1)中,即E(a*b)中有(b-1)*b^(q-1)

        若E(a*b)拆分为E(a)*E(b),则多乘了一次(b-1)*b^(-1),那么我们为了方程两边相等,得到了:

        E(a*b)=E(a)*E(b)*b/(b-1)

        因为b是素数,phi(b)=b-1

        所以E(a*b)=E(a)*b。

    另一种证明:phi(a*b)=phi(a)*b,a%b==0

    a=k*b^n,gcd(k,b)==1

    phi(a*b)=phi(k*b^(n+1))=phi(k)*(b-1)*b^n

    phi(k)=phi(k*b^n)/phi(b)=phi(k*b^n)/((b-1)*(b^(n-1)))

    约分,则phi(a*b)=phi(k*b^n)*b=phi(a)*b

     

    推论(三): 当n为奇数时,E(2n)=E(n)

       2是一个质数,n为奇数则一定与2互质,E(2n)=E(2)*E(n),其中E(2)=1。

    推论(四): 当n是一个大于2的正整数时,E(n)是偶数

       若n是素数,则E(n)=n-1,又因为素数中偶数只有2,则n-1一定是偶数

       若n是合数,则可以分解质因数,E(n)=E(p1)*E(p2)*…… 根据上一步的结论,E(n)一定是偶数。

    有了上面的基础,我们就可以轻易地推出O(n)的方法解决这个问题了,也就是在欧拉筛中顺便更新欧拉函数值。

    具体看代码吧,非常明白的了。

    今天还做了几题欧拉函数的题,真是觉得自己不是完全懂欧拉函数的。现在把这道题学到的东西归纳一下,才发现一道代码这么短的题有这么多的知识。。

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 using namespace std;
     6 
     7 typedef long long LL;
     8 const int Max=(int)1e6;
     9 const int N=Max+100;
    10 LL pl;
    11 LL p[N],phi[N],sum[N];
    12 bool vis[N];
    13 
    14 void eular()
    15 {
    16     memset(vis,0,sizeof(vis));
    17     pl=0;
    18     for(int i=2;i<=Max;i++)
    19     {
    20         if(!vis[i]) p[++pl]=i,phi[i]=i-1;
    21         for(int j=1;j<=pl;j++)
    22         {
    23             if(i*p[j]>Max) break;
    24             vis[i*p[j]]=1;
    25             if((i%p[j])==0) 
    26             {
    27                 phi[i*p[j]]=phi[i]*p[j];
    28                 break;
    29             }
    30             else phi[i*p[j]]=phi[i]*(p[j]-1);
    31         }
    32     }
    33 }
    34 
    35 int main()
    36 {
    37     // freopen("a.in","r",stdin);
    38     // freopen("a.out","w",stdout);
    39     eular();
    40     sum[2]=1;
    41     for(LL i=3;i<=Max;i++) sum[i]=sum[i-1]+phi[i];
    42     while(1)
    43     {
    44         LL x;
    45         scanf("%I64d",&x);
    46         if(!x) return 0;
    47         printf("%I64d
    ",sum[x]);
    48     }
    49     return 0;
    50 }
    View Code
  • 相关阅读:
    数组、链表、Hash的优缺点
    数据库-索引的坏处,事务的级别,分布式事务的原理。
    4G内存的电脑,如何读取8G的日志文件进行分析,汇总数据成报表的面试题
    数据库常用的锁有哪些
    2020年最新 C# .net 面试题,月薪20K+中高级/架构师必看(十)
    ThreadX应用开发笔记之一:移植ThreadX到STM32平台
    net core 方法 返回值 重改?
    使用RestTemplate发送HTTP请求举例
    dedecms织梦手机站上一篇下一篇链接错误的解决方法
    多目标跟踪之数据关联(匈牙利匹配算法和KM算法)
  • 原文地址:https://www.cnblogs.com/KonjakJuruo/p/5182478.html
Copyright © 2011-2022 走看看