码迷,mamicode.com
首页 > 其他好文 > 详细

欧拉函数

时间:2017-12-09 20:47:07      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:因子   复杂度   for   pre   中间   溢出   ++   i++   返回   

欧拉函数是指从1到n之内,与n互质的数的个数

欧拉函数推论:一个数的所有质因子之和是euler(n)*n/2;

求出一个数的欧拉函数的复杂度是sqrt(n);

可以线性打出欧拉函数表

//直接求解欧拉函数  
int euler(int n){ //返回euler(n)   
     int res=n,a=n;  
     for(int i=2;i*i<=a;i++){  
         if(a%i==0){  
             res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出   
             while(a%i==0) a/=i;  
         }  
     }  
     if(a>1) res=res/a*(a-1);  
     return res;  
}  
  
//筛选法打欧拉函数表   
#define Max 1000001  
int euler[Max];  
void Init(){   
     euler[1]=1;  
     for(int i=2;i<Max;i++)  
       euler[i]=i;  
     for(int i=2;i<Max;i++)  
        if(euler[i]==i)  
           for(int j=i;j<Max;j+=i)  
              euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出   
} 

 

欧拉函数

标签:因子   复杂度   for   pre   中间   溢出   ++   i++   返回   

原文地址:http://www.cnblogs.com/lalalatianlalu/p/8012433.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!