1.欧拉函数
度娘:点击打开链接
定义:对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。
通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn)
其中p1, p2……pn为x的所有质因数,x是不为0的整数,且φ(1)=1(唯一和1互质的数就是1本身)。(注意:每种质因数只一个,比如:12=2*2*3,φ(12)=12*(1-1/2)*(1-1/3)=4))
实现:
while(cin>>n)
{
leave=n;
for(i=2;i*i<n+1;i++)
{
if(n%i==0)
leave=(leave/i)*(i-1);
while(n%i==0)
n/=i;
}
if(n>1)
leave=(leave/n)*(n-1);
}
批量实现:
memset(a,0,sizeof(a));
for(i=0;i<NUM;i++)
b[i]=i;
for(i=2;i<NUM;i++)//注意i的范围
{
if(!a[i])
{
b[i]=i-1;//素数
for(j=2*i;j<NUM;j+=i)
{
b[j]=b[j]/i*(i-1);——————##
a[j]=1;
}
}
}
##:if(i==b[i])
for(j=i;j<NUM;j+=i)
b[j]=b[j]/i*(i-1);
2.欧拉函数扩展
求小于等于(<=)n的所有与n互质的数的和:A=φ(n)*n/2
不互质即:B=n*(n-1)-A(不包括n本身)
例如:hdu 3501
sum=(n-1)*n/2;
leave=cpri=n;
for(i=2;i*i<n+1;i++)
{
if(n%i==0)
leave=leave/i*(i-1);
while(n%i==0)
n/=i;
}
if(n>1)
leave=leave/n*(n-1);
cpri=leave*cpri/2;
printf("%I64d\n",(sum-cpri)%1000000007);