欧拉函数
对正整数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。
那么如何变成实现欧拉函数呢?下面通过两种不同的方法来实现。
至于应用的方面,我对这方面接触不多,所以好好看看下面的题目吧。
*欧拉函数:
数论里很多地方都能用到欧拉函数,很重要的。
pku1284 Primitive Roots (很水)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1284
pku2407 Relatives (很水)
http://acm.pku.edu.cn/JudgeOnline/problem?id=2407
pku2773 Happy 2006
http://162.105.81.212/JudgeOnline/problem?id=2773
pku2478 Farey Sequence (快速求欧拉函数)
http://162.105.81.212/JudgeOnline/problem?id=2478
pku3090 Visible Lattice Points (法雷级数)
http://acm.pku.edu.cn/JudgeOnline/problem?id=3090
*推荐:(欧拉函数,费马小定理)
pku3358 Period of an Infinite Binary Expansion
int euler[MAXN+1];
void getEuler()
{
memset(euler,0,sizeof(euler));
euler[1] = 1;
for(int i = 2;i<MAXN;i++)
if (!euler[i])
for(int j = i; j <MAXN;j += i)
{
if (!euler[j]) euler[j] = j;
euler[j] = euler[j]/i*(i-1);
}
}
long long eular(long long n)
{
long long ans = n;
for(int i = 2;i*i<=n;i++)
{
if (n% i ==0)
{
ans = ans - ans/i;
while(n % i ==0 )
n /= i;
}
}
if (n>1) ans -=ans/n;
return ans;
}