欧拉函数
欧拉函数的值fi(n)=1~n中和n互素的数个数
其中fi(1)=1
p为素数时,fi(p)=p-1
一般计算方法(用容斥推来)
fi(i)=i * ( ( p1-1)/p1) * …*(pn-1/pn),pi为i的质因数
欧拉函数线性筛
原理:
积性函数
假设素数p是n的质因数,那么
- 如果p还能整除n/p, phi(n) = phi(n/p)*p
- 如果p不能整除n/p, phi(n) = phi(n/p) * phi(p)
int phi[maxn];
int isp[maxn],sz;
void Init(int n)
{
phi[1]=1;//特殊情况必须考虑
for(int i=2;i<=n;i++)
{
if(!phi[i])phi[i]=i-1,isp[++sz]=i;
for(int k=1;k<=sz && i*isp[k];k++)
{
if(i%isp[k]==0)
{
phi[i*isp[k]]=phi[i]*isp[k];//这里的isp[k]没有用欧拉函数
break;
}
phi[i*isp[k]]=phi[i]*phi[isp[k]];
}
}
}
容斥原理
先跑公因数,然后跑容斥即可,可以求1~r有多少个数和n互素