欧拉函数模版
/*http://baike.baidu.com/view/107769.htm
* 欧拉函数:
定义:用于计算 p(n),小于等于n的所有与n互质的数的个数。例如p[8]=4,(1,3,5,7)
计算公式:p(n)=n*(1-1/p1)*(1-1/p2)....*(1-1/pk)【p1,p2,pk都是n的素因子】
另:若n=p1^q1*p2^q2*.....*pk^qk
则,p(n)=(p1-1)*p1^(q1-1)*(p1-1)*p2^(q2-1)......*(pk-1)*pk^(qk-1)
性质:若m,n互质,φ(mn)=φ(m)φ(n)。当n为奇数时,φ(2n)=φ(n)
*/
求欧拉函数 eluer[n]:
View Code
1 //求欧拉函数的模板: 2 3 int euler(int n)//返回euler(n) 4 { 5 int i; 6 int res = n,a = n; 7 for(i = 2;i*i <= a; ++i) 8 { 9 if(a%i == 0) 10 { 11 res -= res/i; //p(n) = (p - p/p1)(1 - 1/p2)...... 12 while(a%i == 0) a/=i; 13 } 14 } 15 if(a > 1) res -= res/a;//存在大于sqrt(a)的质因子 16 return res; 17 }
打表:
View Code
1 #define MAXN 1000010 2 3 long long euler[MAXN];//sum_euler[i]表示2-->i的欧拉数和 4 int n; 5 void get_euler() 6 { 7 int i,j; 8 euler[1]=1; 9 for(i=2;i<MAXN;i++) 10 euler[i]=i; 11 for(i=2;i<MAXN;i++) 12 if(euler[i]==i)//这里满足的肯定是素数 13 { 14 for(j=i;j<MAXN;j+=i)//更新含有它的数 15 euler[j]=euler[j]/i*(i-1);//:p(n)=n*(1-1/p1)*(1-1/p2)....*(1-1/pk) 16 } 17 }