zoukankan      html  css  js  c++  java
  • 欧拉函数的简单求法及欧拉打表法

    欧拉函数的意义为,对于一个正整数n来说,euler(n)即为小于等于n,且与n互斥的数的个数

    根据容斥原理可得:

    euler(n)=n-n/p1-n/p2....-n/pn+n/p1p2+n/p1p3+n/p2p3...+n/pn-1pn-n/p1p2p3.......

    =n(1-1/p1)(1-1/p2)....(1-1/pn)

    同样根据积性原理可得:

    若m,n互斥则

    euler(m*n)=euler(m)*euler(n);

    因为n=p1^k1+p2^k2....+pn^kn

    所以euler(n)=euler(p1^k1)*euler(p2^k2)*....euler(pn^kn)

    因为p为素数的话euler(pn^kn)=pn^kn-pn^(kn-1)=pn^(kn-1)(1-1/pn);

    所以euler(n)=n(1-1/p1)(1-1/p2)....(1-1/pn)

    计算欧拉函数:

     1  int euler_phi(int n)
     2  {
     3       int m=(int)sqrt(n+0.5);
     4       int ans=n;
     5       for(int i=2;i<=m;i++)
     6           if(n%i==0)//找素因子
     7           {
     8               ans=ans/i*(i-1);
     9               while(n%i==0)n/=i;//除尽
    10           }
    11      if(n>1)ans=ans/n*(n-1);
    12      return ans; 
    13  }
     


    打表求欧拉函数:

     1 int phi[maxn];
     2 void phi_table(int n)
     3 {
     4     for(int i=2;i<=n;i++)phi[i]=0;
     5     phi[1]=1;
     6     for(int i=2;i<=n;i++)
     7         if(!phi[i])
     8             for(int j=i;j<=n;j+=i)
     9             {
    10                 if(!phi[j])phi[j]=j;
    11                 phi[j]=phi[j]/i*(i-1);
    12             }
    13 }
  • 相关阅读:
    acm课程练习2--1005
    acm课程练习2--1003
    [ZJOI2010]网络扩容
    [ZJOI2009]狼和羊的故事
    [FJOI2007]轮状病毒
    [NOIP2016提高组]换教室
    [NOIP2016提高组]愤怒的小鸟
    [NOIP2009提高组]最优贸易
    [洛谷P2245]星际导航
    [NOIP2013提高组]货车运输
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/3863264.html
Copyright © 2011-2022 走看看