本文直接使用刘汝佳《算法竞赛入门经典》(第2版)中的讲解部分,此部分讲解的非常清楚明白,不再过多赘述,唯一要写的是对第二个代码的理解。
void phi_table(int n,int *phi){
for(int i=2;i<=n;i++) phi[i]=0;
phi[1]=1;
for(int i=2;i<=n;i++){
if(!phi[i]){ //已经求出过欧拉函数值的i,不能再求,只求还没算出的
for(int j=i;j<=n;j+=i){
if(!phi[j]) phi[j]=j;//还没开始求的,先初始化欧拉函数值,再开始套用公式求
phi[j]=phi[j]/i*(i-1);//关键一步,因为j是i的整数倍,那么i必然
//是j的标准分解式中的一个p值,套用公式求欧拉函数即可
}
}
}
}