定义
欧拉函数的线性筛板子
void get_hpi()
{
hpi[1]=1;
for(int i=2;i<=n;i++)
{
if(!st[i])
{
prime[cnt++]=i;
hpi[i]=i-1;//1
}
for(int j=0;prime[j]<=n/i;j++)
{
st[prime[j]*i]=true;
if(i%prime[j]==0)//2
{
hpi[i*prime[j]]=hpi[i]*prime[j];
break;
}
hpi[prime[j]*i]=hpi[i]*(prime[j]-1);//3
}
}
}
1.hpi[i]=i-1;
当i是质数时,1~i-1都与i互质
2. hpi[i*prime[j]]=hpi[i]*prime[j];
首先:
当primes[j]是i的质因子时候,i的质因子就包含了i*primes[j]的所有·质因子,那么hpi[ i*primes[j]]就等于:
3.hpi[prime[j]*i]=hpi[i]*(prime[j]-1)
当primes[j]不是i的质因子时候,i*primes[j]的质因子是i的所有质因子和primes[j],那么hpi[ i*primes[j]]就等于: