定义
1 1 1~ N N N中与 N 互质的数的个数叫欧拉函数,记为 φ ( N ) φ ( N ) φ(N)。
对 N 分解质因数
N
=
p
1
c
1
∗
p
1
c
1
∗
.
.
.
∗
p
k
c
k
N=p_1^{c_1}*p_1^{c_1}*...*p_k^{c_k}
N=p1c1∗p1c1∗...∗pkck
则有
φ
(
N
)
=
N
∗
(
1
−
1
p
1
)
∗
(
1
−
1
p
2
)
∗
.
.
.
∗
(
1
−
1
p
k
)
\varphi(N)=N*(1-\frac{1}{p_1})*(1-\frac{1}{p_2})*...*(1-\frac{1}{p_k})
φ(N)=N∗(1−p11)∗(1−p21)∗...∗(1−pk1)
特别的
φ
(
1
)
=
1
\varphi(1)=1
φ(1)=1
推导
首先显然 1 1 1~ N N N中与 N N N互质的数就是 1 − N 1 − N 1−N中不与 N N N含有相同质因子的数
那么先简单分析 N 只有两个质因子的情况,假设
p
,
q
p,q
p,q为 N的质因子,那么 1~ N 中p的倍数有
N
p
\frac{N}{p}
pN 个,q的倍数有
N
q
\frac{N}{q}
qN
我们自然要筛掉这些数 :
N
−
N
p
−
N
q
N-\frac{N}{p}-\frac{N}{q}
N−pN−qN
但是注意到这里面 p*q的倍数被减了两次,根据容斥原理,当然还要加回来得 :
N
−
N
p
−
N
q
+
N
p
q
N-\frac{N}{p}-\frac{N}{q}+\frac{N}{pq}
N−pN−qN+pqN
对这个式子稍作变换
N
−
N
p
−
N
q
+
N
p
q
N-\frac{N}{p}-\frac{N}{q}+\frac{N}{pq}
N−pN−qN+pqN
⇓
N
∗
(
1
−
1
p
−
1
q
+
1
p
q
)
N*(1-\frac{1}{p}-\frac{1}{q}+\frac{1}{pq})
N∗(1−p1−q1+pq1)
⇓
N
∗
(
1
−
1
p
)
∗
(
1
−
1
q
)
N*(1-\frac{1}{p})*(1-\frac{1}{q})
N∗(1−p1)∗(1−q1)
实现
int phi(int x)
{
int res=x;
for(int i=2;i*i<=x;++i)
{
if(x%i==0)
{
res=res/i*(i-1);
while(x%i==0) x/=i;
}
}
if(x>1) res=res/x*(x-1);
return res;
}
利用线性筛递推求解φ需要用到欧拉函数的两个性质
- 若有 p ∣ N p∣N p∣N,且满足 p 2 ∣ N , 则 φ ( N ) = φ ( N / p ) ∗ p p^2\mid N,则 φ ( N ) = φ ( N / p ) ∗ p p2∣N,则φ(N)=φ(N/p)∗p
- 若有 p ∣ N p ∣ N p∣N,且一定不满足 p 2 ∣ N p^2\mid N p2∣N,则 φ ( N ) = φ ( N / p ) ∗ ( p − 1 ) φ ( N ) = φ ( N / p ) ∗ ( p − 1 ) φ(N)=φ(N/p)∗(p−1)
》》证明
线性筛中每个合数n只会被他的最小质因子p筛一次
于是我们利用这点从
φ
(
N
/
p
)
φ ( N / p )
φ(N/p)递推到
φ
(
N
)
φ ( N )
φ(N)
phi[1]=1;
for(int i=2;i<=n;i++)
{
if(!v[i])
{
zhi[++cnt]=i;
phi[i]=i-1;
}
for(int j=1;i*zhi[j]<=n&&j<=cnt;j++)
{
v[i*zhi[j]]=1;
if(i%zhi[j]==0)
{
phi[i*zhi[j]]=phi[i]*zhi[j];
}
else phi[i*zhi[j]]=phi[i]*(zhi[j]-1);
}
}