一、欧拉函数
1、欧拉函数被定义为小于或等于n的数中与n互质的个数。它的一般计算式是:,其中p1...pk为n的所有质因子。
2、有关欧拉函数的几点性质如下:
phi(1) = 1
若n是质数,那么phi(n) = n-1
若n是质数x的k次幂,phi(n) = (x-1)*x^(k-1)
若m,n互质,那么phi(m*n) = phi(m)*phi(n)
若n是奇数,那么phi(2*n) = phi(n)
若x,y是质数,且n = x*y,那么phi(n) = (x-1)*(y-1)
小于n且与n互质的数的和为:n/2 * phi(n)
3、求解某个欧拉函数值,代码如下:
int oula(int n)
{
int res = n, a = n;
for(int i = 2; i*i <= a; ++i){
if(a%i == 0){
res = res/i*(i-1);
while(a%i == 0) a = a/i;
}
}
if(a > 1) res = res/a*(a-1);
return res;
}
4、求解1~n中所有数的欧拉函数值,并保存在了phi数组中,代码如下:
const int MAXN = 3e6+5;
__int64 phi[MAXN];
void PhiTable(int n)
{
for(int i=2; i<=n; ++i)
phi[i] = 0;
phi[1] = 1;
for(int i=2; i<=n; ++i) if((!phi[i]))
for(int j=i; j<=n; j+=i)
{
if(!phi[j]) phi[j] = j;
phi[j] = phi[j]/i * (i-1);
}
}
5、求出了1~n中所有数的欧拉函数值的前缀和,并保存在了f数组中,代码如下:
const int MAXN = 3e6+5;
__int64 f[MAXN];
void SumPhiTable(int n)
{
f[1] = 1;
for(int i=2; i<n; ++i)
{
if(!f[i])
{
for(int j=i; j<n; j+=i)
{
if(!f[j]) f[j] = j;
f[j] = f[j]/i * (i-1);
}
}
f[i] += f[i-1];
}
}