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

欧拉函数

时间:2018-02-03 00:41:16      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:ott   sans   bottom   post   void   除法   pac   margin   top   

定义和简单性质

欧拉函数在OI中是个非常重要的东西,不知道的话会吃大亏的.

欧拉函数用希腊字母φ表示,φ(N)表示N的欧拉函数.

对φ(N)的值,我们可以通俗地理解为小于N且与N互质的数的个数(包含1).

欧拉函数的一些性质:

1.对于素数p, φ(p)=p-1,对于对两个素数p,q φ(pq)=pq-1

欧拉函数是积性函数,但不是完全积性函数.

2.对于一个正整数N的素数幂分解N=P1^q1*P2^q2*...*Pn^qn.

 

   φ(N)=N*(1-1/P1)*(1-1/P2)*...*(1-1/Pn).

 

3.除了N=2,φ(N)都是偶数.

 

4.设N为正整数,∑φ(d)=N (d|N).

 

根据性质2,我们可以在O(sqrt(n))的时间内求出一个数的欧拉函数值.

 

如果我们要求1000000以内所有数的欧拉函数,怎么办.

上面的方法复杂度将高达O(N*sqrt(N)).

我们来看看线性筛法的程序:

#include<iostream>
#include<cstdio>
using namespace std;
int euler[100];
int Max = 100;
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)  //注意,j += i
               euler[j] = euler[j] / i * (i - 1);//先进行除法是为了防止中间数据的溢出     
}
int main()
{
    int a; 
    cin>>a;
    Init();
    cout<<euler[a];
    return 0;
}

 

妙啊!!!!!!!!!!!

 


 

欧拉函数

标签:ott   sans   bottom   post   void   除法   pac   margin   top   

原文地址:https://www.cnblogs.com/DukeLv/p/8407290.html

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