本博客中部分文章已被迁移至新博客,但本文由于内容较简单并未迁移且不在迁移计划中。
前排提醒:如无特殊说明,本文中所有符号与**《初等数论》(第三版,潘承洞 潘承彪著),北京大学出版社**一书中意义相同
关于 E u l e r Euler Euler函数 φ ( x ) \varphi(x) φ(x)
E u l e r Euler Euler函数 φ ( x ) \varphi(x) φ(x)的定义与基本性质
本着定义是重中之重的原则,我们先来回顾一下 E u l e r Euler Euler函数的定义:
对于任意正整数 n n n,我们记小于 n n n且与 n n n互素的正整数的个数 φ ( m ) \varphi(m) φ(m)为 m m m的Euler函数。即: φ ( m ) = ∑ d ≤ m [ ( m , d ) = 1 ] \varphi(m)=\sum_{d\leq m}[(m,d)=1] φ(m)=d≤m∑[(m,d)=1]
由定义立即可推出它的一些简单的性质:
- φ ( m ) = m \varphi(m)=m φ(m)=m的既约剩余系的个数。特别地,对于素数 p , φ ( p ) = p − 1 p,\varphi(p)=p-1 p,φ(p)=p−1
- 设 m = m 1 m 2 m=m_1m_2 m=m1m2,若 m 1 m_1 m1和 m 2 m_2 m2的素因子集合相同,那么 φ ( m ) = m 2 φ ( m 1 ) \varphi(m)=m_2\varphi(m_1) φ(m)=m2φ(m1)
- 设 m = m 1 m 2 m=m_1m_2 m=m1m2,若 ( m 1 , m 2 ) = 1 , (m_1,m_2)=1, (m1,m2)=1,那么 φ ( m ) = φ ( m 1 ) φ ( m 2 ) , \varphi(m)=\varphi(m_1)\varphi(m_2), φ(m)=φ(m1)φ(m2),即 E u l e r Euler Euler函数 φ ( x ) \varphi(x) φ(x)是积性函数
- 记 m m m的标准分解为 m = ∏ p i α i , m=\prod p_{i}^{\alpha_i}, m=∏piαi,则有 φ ( m ) = m ∏ ( 1 − 1 p i ) \varphi(m)=m \prod (1 {-} \dfrac 1 {p_i} ) φ(m)=m∏(1−pi1)
- 对于任意正整数 m m m,都有 m = ∑ d ∣ m φ ( d ) m=\sum_{d|m}\varphi(d) m=d∣m∑φ(d)
这些性质都比较显然,在这里不作证明
φ ( x ) \varphi(x) φ(x)的计算方法
如果只是询问一个数的函数值,最显然的思路就是O( n \sqrt {n} n)求解。
inline int phi(int x)
{
int ans=x;
for(int i=2;i<=sqrt(x);i++) if(x%i==0)
{
ans-=ans/i;
while(x%i==0) x/=i;
}
return ans;
}
但更多的时候我们是需要求很多很多的
φ
(
x
)
\varphi(x)
φ(x)的值,这样的做法就显得不是很妙。
我们发现可以在筛素数的时候顺手处理
φ
(
x
)
\varphi(x)
φ(x)的值,于是就有了下面这两种很常用的预处理
φ
(
x
)
\varphi(x)
φ(x)的方法
//Eratosthenes筛法,时间复杂度O(n log log n)
void init()
{
for(int i=1;i<=maxn;i++) phi[i]=i;
for(int i=2;i<=maxn;i++) if(!vis[i])
{
prime[++cnt]=i; phi[i]--;
for(int j=i*2;j<=maxn;j+=i) vis[j]=1,phi[j]-=phi[j]/i;
}
}
//线性筛法,时间复杂度O(n)
void init()
{
for(i=2;i<=maxn;i++)
{
if(!vis[i]) prime[++cnt]=i,phi[i]=i-1;
for(int j=1;j<=cnt&&i*prime[j]<=maxn;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]) phi[i*prime[j]]=phi[i]*(prime[j]-1);
else
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
}
}
}
关于 M o b i u s Mobius Mobius函数 μ ( x ) \mu(x) μ(x)
M o b i u s Mobius Mobius函数 μ ( x ) \mu(x) μ(x)的定义与性质
废话不多说,直接上定义:
对于正整数 n > 1 n>1 n>1,记其标准分解为 n = ∏ i = 1 r p i α i n=\prod_{i=1}^r p_i^{\alpha_i} n=i=1∏rpiαi则有KaTeX parse error: No such environment: eqnarray at position 7: \begin{̲e̲q̲n̲a̲r̲r̲a̲y̲}̲\mu(x)= \begin{…
特别地,有 μ ( 1 ) = 1 \mu(1)=1 μ(1)=1
从以上定义,可以推出以下几点性质:
- 若$\mu(x)\not =0$,则$x$没有比$1$大的平方数因子
- 若$(m_1,m_2)=1$,则有$\mu(m_1m_2)=\mu(m_1)\mu(m_2)$,即$Mobius$函数$\mu(x)$是积性函数
- 对于任意正整数$n$,都有$$\begin{eqnarray}\sum_{d|n}\mu(d)=\begin{cases}1&n=1\\0&n\not=1\end{cases}\end{eqnarray}$$
- 对于任意正整数$n$,都有$$\mu(m)=\sum_{xmodm}e^{\frac {2\pi ix} m}$$这里$xmodm$表示对$m$的任意一组既约剩余系求和
####性质3:
n = 1 n=1 n=1时,命题显然成立。
n > 1 n>1 n>1时,记 n n n的素因子个数为 r r r,则由 M o b i u s Mobius Mobius函数的定义,有 ∑ d ∣ n μ ( d ) = C r 0 − C r 1 + ⋯ + ( − 1 ) r C r r = ( 1 − 1 ) r = 0 \sum_{d|n}\mu(d)=C_r^0-C_r^1+\cdots+(-1)^rC_r^r=(1-1)^r=0 d∣n∑μ(d)=Cr0−Cr1+⋯+(−1)rCrr=(1−1)r=0
####性质4:
由复数相关知识,对于任意正整数 c c c,显然有KaTeX parse error: No such environment: eqnarray at position 7: \begin{̲e̲q̲n̲a̲r̲r̲a̲y̲}̲ \sum_{i=1}^m e…
记 m m m的标准分解为 m = ∏ i = 1 r p i α i m=\prod_{i=1}^r p_i^{\alpha_i} m=i=1∏rpiαi设 m j = p j α j ( 1 ≤ j ≤ r ) m_j=p_j^{\alpha_j}(1\leq j\leq r) mj=pjαj(1≤j≤r)以及 m j M j = m m_jM_j=m mjMj=m,由数论的相关定理,当 x ( j ) x^{(j)} x(j)分别遍历模 m j m_j mj的缩系时, x = ∑ i = 1 r M i x ( i ) x=\sum_{i=1}^r M_ix^{(i)} x=i=1∑rMix(i)遍历模 m m m的缩系,于是有 S ( m ) = ∑ x m o d m e 2 π i x m = ∑ x ( 1 ) m o d m 1 ⋯ ∑ x ( r ) m o d m r e 2 π i ( M 1 x ( 1 ) + M 2 x ( 2 ) + ⋯ + M r x ( r ) ) m = S ( m 1 ) S ( m 2 ) ⋯ S ( m r ) S(m)=\sum_{xmodm}e^{\frac {2\pi ix} m}=\sum_{x^{(1)}modm_1}\cdots\sum_{x^{(r)}modm_r} e^{\frac{2\pi i(M_1x^{(1)}+M_2x^{(2)}+\cdots+M_rx^{(r)})} m}\\=S(m_1)S(m_2)\cdots S(m_r) S(m)=xmodm∑em2πix=x(1)modm1∑⋯x(r)modmr∑em2πi(M1x(1)+M2x(2)+⋯+Mrx(r))=S(m1)S(m2)⋯S(mr)
容易看出KaTeX parse error: No such environment: eqnarray at position 7: \begin{̲e̲q̲n̲a̲r̲r̲a̲y̲}̲S(p_j^{\alpha_j…于是性质4得证。
μ ( x ) \mu(x) μ(x)的计算方法
和 E u l e r Euler Euler函数一样,如果需要单点求值,只需要 O ( n ) O(\sqrt n) O(n)分解素因子即可。
inline int miu(int x)
{
int ans=1;
for(int i=1;i<=sqrt(x);i++) if(x%i==0)
{
ans=-ans,x/=i;
if(x%i==0) return 0;
}
return x>1?-ans:ans;
}
至于多点求值,考虑到 μ ( x ) \mu(x) μ(x)是积性函数,我们可以用线性筛来做到 O ( n ) O(n) O(n)预处理。
void init()
{
miu[1]=1;
for(int i=2;i<=maxn;i++)
{
if(!vis[i]) prime[++cnt]=i,miu[i]=-1;
for(int j=1;j<=cnt&&i*prime[j]<maxn;j++)
{
int t=i*prime[j]; vis[t]=1;
if(i%prime[j]==0) {miu[t]=0; break;}
miu[t]=-miu[i];
}
}
}
好啦,基础知识先介绍这么多,可以开始做题了。
典型习题
BZOJ2705 欧拉函数
题意:
给定正整数
N
(
N
≤
2
32
)
N(N\leq2^{32})
N(N≤232),求值
∑
i
=
1
N
g
c
d
(
i
,
N
)
\sum_{i=1}^N gcd(i,N)
i=1∑Ngcd(i,N)
分析:
将
g
c
d
(
i
,
N
)
gcd(i,N)
gcd(i,N)按值分类,问题转化为求满足
(
i
,
N
)
=
d
(i,N)=d
(i,N)=d的
i
i
i的个数。
由于
(
i
,
N
)
=
d
(i,N)=d
(i,N)=d等价于
(
i
d
,
N
d
)
=
1
(\dfrac i d,\dfrac N d)=1
(di,dN)=1,于是所求的个数就是
φ
(
N
d
)
\varphi(\dfrac N d)
φ(dN),问题的答案即为
∑
d
∣
N
d
φ
(
N
d
)
\sum_{d|N} d\varphi(\dfrac N d)
d∣N∑dφ(dN)
时间复杂度:
O
(
τ
(
N
)
N
)
O(\tau(N)\sqrt N )
O(τ(N)N)
下面贴出代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int N,m;
LL ans;
inline LL read()
{
LL ans=0; char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') ans=ans*10+ch-'0',ch=getchar();
return ans;
}
inline LL phi(LL u)
{
LL ans=u;
for(int i=2;i<=sqrt(u);i++) if(u%i==0)
{
ans-=ans/i;
while(u%i==0) u/=i;
}
if(u>1) ans-=ans/u;
return ans;
}
int main()
{
N=read(),m=sqrt(N);
for(int i=1;i<=m;i++) if(N%i==0)
{
ans+=i*phi(N/i);
if(N/i!=i) ans+=N/i*phi(i);
}
printf("%lld",ans);
return 0;
}
BZOJ2818 Gcd
题意:
给定
N
N
N,求
{
1
,
2
,
⋯
,
N
}
2
\{1,2,\cdots,N\}^2
{1,2,⋯,N}2中有多少对
(
x
,
y
)
(x,y)
(x,y)满足
(
x
,
y
)
(x,y)
(x,y)为素数
分析:
还是上一题的套路,
(
i
,
N
)
=
p
(i,N)=p
(i,N)=p等价于
(
i
p
,
N
p
)
=
1
(\dfrac i p,\dfrac N p)=1
(pi,pN)=1,不同的是这一次
p
p
p应该取遍所有小于
N
N
N的素数。答案为
2
∑
p
≤
N
ϕ
(
[
N
p
]
)
−
π
(
N
)
2\sum_{p \leq N}\phi ( \left[ \dfrac N p \right] )-\pi(N)
2p≤N∑ϕ([pN])−π(N)
其中
ϕ
(
x
)
=
∑
i
=
1
x
φ
(
i
)
\phi(x)=\sum_{i=1}^x \varphi(i)
ϕ(x)=i=1∑xφ(i)
时间复杂度:
O
(
n
)
O(n)
O(n)(线性筛)或
O
(
n
l
o
g
l
o
g
n
)
O(n log log n)
O(nloglogn)(埃氏筛)
BZOJ2005 能量采集
这里用到数论中的一个结论:长为
n
n
n宽为
m
m
m的矩形对角线上(含端点)的整点数为
(
n
,
m
)
+
1
(n,m)+1
(n,m)+1
由此可知所求答案即为
∑
i
=
1
m
∑
j
=
1
n
(
2
(
i
,
j
)
−
1
)
\sum_{i=1}^m \sum_{j=1}^n (2(i,j)-1)
i=1∑mj=1∑n(2(i,j)−1)乍一看貌似和上面所说的并没有太大关系,但我们可以作进一步的代数变形。
我们不妨假设总有
m
≤
n
m\leq n
m≤n
∑
i
=
1
m
∑
j
=
1
n
(
2
(
i
,
j
)
−
1
)
=
2
∑
i
=
1
m
∑
j
=
1
n
(
i
,
j
)
−
m
n
=
2
∑
i
=
1
m
∑
j
=
1
n
∑
d
∣
(
i
,
j
)
φ
(
d
)
−
m
n
=
2
∑
i
=
1
m
∑
j
=
1
n
∑
d
=
1
m
[
d
∣
i
]
[
d
∣
j
]
φ
(
d
)
−
m
n
=
2
∑
d
=
1
m
φ
(
d
)
(
∑
j
=
1
n
[
d
∣
j
]
(
∑
i
=
1
m
[
d
∣
i
]
)
)
−
m
n
=
2
∑
d
=
1
m
φ
(
d
)
[
n
d
]
[
m
d
]
−
m
n
\sum_{i=1}^m \sum_{j=1}^n (2(i,j)-1) =2\sum_{i=1}^m \sum_{j=1}^n (i,j)-mn \\ =2\sum_{i=1}^m \sum_{j=1}^n \sum_{d|(i,j)}\varphi(d)-mn =2\sum_{i=1}^m \sum_{j=1}^n \sum_{d=1}^m[d|i][d|j]\varphi(d)-mn\\ =2\sum_{d=1}^m \varphi(d) \left( \sum_{j=1}^n [d|j] \left( \sum_{i=1}^m[d|i] \right) \right)-mn \\ =2\sum_{d=1}^m \varphi(d) \left[ \dfrac n d \right] \left[ \dfrac m d \right]-mn
i=1∑mj=1∑n(2(i,j)−1)=2i=1∑mj=1∑n(i,j)−mn=2i=1∑mj=1∑nd∣(i,j)∑φ(d)−mn=2i=1∑mj=1∑nd=1∑m[d∣i][d∣j]φ(d)−mn=2d=1∑mφ(d)(j=1∑n[d∣j](i=1∑m[d∣i]))−mn=2d=1∑mφ(d)[dn][dm]−mn
好了,做完了。
时间复杂度同上一题。
SPOJ-VLATTICE
说白了就是求在集合
[
0
,
1
,
2
,
⋯
,
N
]
3
[0,1,2,\cdots,N]^3
[0,1,2,⋯,N]3中有多少个三元组满足
(
i
,
j
,
k
)
=
1
(i,j,k)=1
(i,j,k)=1
因为含有数字0,所以分类讨论。
坐标轴上一共有三个点可视
(
0
,
0
,
1
)
,
(
0
,
1
,
0
)
,
(
1
,
0
,
0
)
(0,0,1),(0,1,0),(1,0,0)
(0,0,1),(0,1,0),(1,0,0),而在坐标平面内,点的个数是
2
ϕ
(
N
)
−
1
2\phi(N)-1
2ϕ(N)−1,其中
ϕ
(
x
)
\phi(x)
ϕ(x)的含义同上上题。因此,只需要求
∑
i
=
1
N
∑
j
=
1
N
∑
k
=
1
N
[
(
i
,
j
,
k
)
=
1
]
\sum_{i=1}^N\sum_{j=1}^N\sum_{k=1}^N[(i,j,k)=1]
i=1∑Nj=1∑Nk=1∑N[(i,j,k)=1]
由
M
o
b
i
u
s
Mobius
Mobius函数的性质3得
∑
i
=
1
N
∑
j
=
1
N
∑
k
=
1
N
[
(
i
,
j
,
k
)
=
1
]
=
∑
i
=
1
N
∑
j
=
1
N
∑
k
=
1
N
∑
d
=
1
N
[
d
∣
i
]
[
d
∣
j
]
[
d
∣
k
]
μ
(
d
)
=
∑
d
=
1
N
μ
(
d
)
[
N
d
]
3
\sum_{i=1}^N\sum_{j=1}^N\sum_{k=1}^N[(i,j,k)=1]=\sum_{i=1}^N\sum_{j=1}^N\sum_{k=1}^N\sum_{d=1}^N[d|i][d|j][d|k]\mu(d)=\sum_{d=1}^N\mu(d)\left[\dfrac N d\right]^3
i=1∑Nj=1∑Nk=1∑N[(i,j,k)=1]=i=1∑Nj=1∑Nk=1∑Nd=1∑N[d∣i][d∣j][d∣k]μ(d)=d=1∑Nμ(d)[dN]3
综上,最终答案为
A
n
s
(
N
)
=
6
ϕ
(
N
)
+
∑
d
=
1
N
μ
(
d
)
[
N
d
]
3
Ans(N)=6\phi(N)+\sum_{d=1}^N\mu(d)\left[\dfrac N d\right]^3
Ans(N)=6ϕ(N)+d=1∑Nμ(d)[dN]3对于每个询问
O
(
N
)
O(\sqrt N)
O(N)计算即可。总复杂度
O
(
T
N
)
O(T\sqrt N)
O(TN)
未完待续。