文件名称:Euler_fuction2
介绍说明--下载内容均来自于网络,请自行研究使用
//Euler 函数前n项和
/*
phi(n) 为n的Euler原函数
if( (n/p) % i == 0 ) phi(n)=phi(n/p)*i
else phi(n)=phi(n/p)*(i-1)
对于约数:divnum
如果i|pr[j] 那么 divnum[i*pr[j]]=divsum[i]/(e[i]+1)*(e[i]+2) //最小素因子次数加1
否则 divnum[i*pr[j]]=divnum[i]*divnum[pr[j]] //满足积性函数条件
对于素因子的幂次 e[i]
如果i|pr[j] e[i*pr[j]]=e[i]+1 //最小素因子次数加1
否则 e[i*pr[j]]=1 //pr[j]为1次
对于本题:
1. 筛素数的时候首先会判断i是否是素数。
根据定义,当 x 是素数时 phi[x] = x-1
因此这里我们可以直接写上 phi[i] = i-1
2. 接着我们会看prime[j]是否是i的约数
如果是,那么根据上述推导,我们有:phi[ i * prime[j] ] = phi[i] * prime[j]
否则
phi[ i * prime[j] ] = phi[i] * (prime[j]-1)
(其实这里prime[j]-1就是phi[prime[j]],利用了欧拉函数的积性)
经过以上改良,在筛完素数后,我们就计算出了phi[]的所有值。
我们求出phi[]的前缀和
*/-err
/*
phi(n) 为n的Euler原函数
if( (n/p) % i == 0 ) phi(n)=phi(n/p)*i
else phi(n)=phi(n/p)*(i-1)
对于约数:divnum
如果i|pr[j] 那么 divnum[i*pr[j]]=divsum[i]/(e[i]+1)*(e[i]+2) //最小素因子次数加1
否则 divnum[i*pr[j]]=divnum[i]*divnum[pr[j]] //满足积性函数条件
对于素因子的幂次 e[i]
如果i|pr[j] e[i*pr[j]]=e[i]+1 //最小素因子次数加1
否则 e[i*pr[j]]=1 //pr[j]为1次
对于本题:
1. 筛素数的时候首先会判断i是否是素数。
根据定义,当 x 是素数时 phi[x] = x-1
因此这里我们可以直接写上 phi[i] = i-1
2. 接着我们会看prime[j]是否是i的约数
如果是,那么根据上述推导,我们有:phi[ i * prime[j] ] = phi[i] * prime[j]
否则
phi[ i * prime[j] ] = phi[i] * (prime[j]-1)
(其实这里prime[j]-1就是phi[prime[j]],利用了欧拉函数的积性)
经过以上改良,在筛完素数后,我们就计算出了phi[]的所有值。
我们求出phi[]的前缀和
*/-err
(系统自动生成,下载前可以参看下载内容)
下载文件列表
Euler函数前n项和.cpp