定义和简单性质
欧拉函数在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; }
妙啊!!!!!!!!!!!