• 51Nod 1136 欧拉函数 Label:数论


    对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler's totient function、φ函数、欧拉商数等。例如:φ(8) = 4(Phi(8) = 4),因为1,3,5,7均和8互质。
     
    Input
    输入一个数N。(2 <= N <= 10^9)
    Output
    输出Phi(n)。
    Input示例
    8
    Output示例
    4

    代码

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 int a;
     8 int euler(int n){ //返回euler(n)   
     9      int res=n,a=n;  
    10      for(int i=2;i*i<=a;i++){  
    11          if(a%i==0){  
    12              res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出   
    13              while(a%i==0) a/=i;  
    14          }  
    15      }  
    16      if(a>1) res=res/a*(a-1);  
    17      return res;  
    18 }  
    19 
    20 int main(){
    21 //    freopen("01.in","r",stdin);
    22     while(scanf("%d",&a)==1&&a){
    23         cout<<euler(a)<<endl;
    24     }
    25     return 0;
    26 }

    这是根据定义直接求出的函数,poj2407可以供练手  http://poj.org/problem?id=2407

    到处看了一些博客,百度百科讲得最详细,戳这里~(度娘的超链接又长又臭QAQ)

    转载一下两种模板:

    对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。

    例如euler(8)=4,因为1,3,5,7均和8互质。Euler函数表达通式:euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),其中p1,p2……pn为x的所有素因数,x是不为0的整数。euler(1)=1(唯一和1互质的数就是1本身)。 

    欧拉公式的延伸:

    一个数的所有质因子之和是euler(n)*n/2。

    那么如何变成实现欧拉函数呢?下面通过两种不同的方法来实现。

    第一种方法是直接根据定义来实现,同时第一种方法也是第二种筛法的基础,当好好理解。

     1 //直接求解欧拉函数  
     2 int euler(int n){ //返回euler(n)   
     3      int res=n,a=n;  
     4      for(int i=2;i*i<=a;i++){  
     5          if(a%i==0){  
     6              res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出   
     7              while(a%i==0) a/=i;  
     8          }  
     9      }  
    10      if(a>1) res=res/a*(a-1);  
    11      return res;  
    12 }  
    13   
    14 //筛选法打欧拉函数表   
    15 #define Max 1000001  
    16 int euler[Max];  
    17 void Init(){   
    18      euler[1]=1;  
    19      for(int i=2;i<Max;i++)  
    20        euler[i]=i;  
    21      for(int i=2;i<Max;i++)  
    22         if(euler[i]==i)  
    23            for(int j=i;j<Max;j+=i)  
    24               euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出   
    25 }  
    版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 相关阅读:
    博客推荐
    2018
    2018
    学习推荐-Postgresql学习手册
    学习推荐-Redis学习手册
    odoo开发笔记 -- odoo源码解析
    前沿技术相关
    odoo开发笔记-tree列表视图拖拽排序
    odoo开发笔记-日期时间相关操作
    odoo开发笔记 -- 官方模块一览表
  • 原文地址:https://www.cnblogs.com/radiumlrb/p/5930502.html
Copyright © 2020-2023  润新知