[NOIP2017考前复习] Euler函数与Mobius函数

本博客中部分文章已被迁移至新博客,但本文由于内容较简单并未迁移且不在迁移计划中。


前排提醒:如无特殊说明,本文中所有符号与**《初等数论》(第三版,潘承洞 潘承彪著),北京大学出版社**一书中意义相同

关于 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)=dm[(m,d)=1]


由定义立即可推出它的一些简单的性质:

  1. φ ( m ) = m \varphi(m)=m φ(m)=m的既约剩余系的个数。特别地,对于素数 p , φ ( p ) = p − 1 p,\varphi(p)=p-1 p,φ(p)=p1
  2. 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)
  3. 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)是积性函数
  4. 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(1pi1)
  5. 对于任意正整数 m m m,都有 m = ∑ d ∣ m φ ( d ) m=\sum_{d|m}\varphi(d) m=dmφ(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=1rpiα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

从以上定义,可以推出以下几点性质:

  1. 若$\mu(x)\not =0$,则$x$没有比$1$大的平方数因子
  2. 若$(m_1,m_2)=1$,则有$\mu(m_1m_2)=\mu(m_1)\mu(m_2)$,即$Mobius$函数$\mu(x)$是积性函数
  3. 对于任意正整数$n$,都有$$\begin{eqnarray}\sum_{d|n}\mu(d)=\begin{cases}1&n=1\\0&n\not=1\end{cases}\end{eqnarray}$$
  4. 对于任意正整数$n$,都有$$\mu(m)=\sum_{xmodm}e^{\frac {2\pi ix} m}$$这里$xmodm$表示对$m$的任意一组既约剩余系求和
前两个性质比较显然,下面对性质3与性质4做出简略的证明

####性质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 dnμ(d)=Cr0Cr1++(1)rCrr=(11)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=1rpiαi m j = p j α j ( 1 ≤ j ≤ r ) m_j=p_j^{\alpha_j}(1\leq j\leq r) mj=pjαj(1jr)以及 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=1rMix(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)=xmodmem2πix=x(1)modm1x(r)modmrem2π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(N232),求值 ∑ i = 1 N g c d ( i , N ) \sum_{i=1}^N gcd(i,N) i=1Ngcd(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) dNdφ(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) 2pNϕ([pN])π(N)
其中 ϕ ( x ) = ∑ i = 1 x φ ( i ) \phi(x)=\sum_{i=1}^x \varphi(i) ϕ(x)=i=1xφ(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=1mj=1n(2(i,j)1)乍一看貌似和上面所说的并没有太大关系,但我们可以作进一步的代数变形。
我们不妨假设总有 m ≤ n m\leq n mn
∑ 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=1mj=1n(2(i,j)1)=2i=1mj=1n(i,j)mn=2i=1mj=1nd(i,j)φ(d)mn=2i=1mj=1nd=1m[di][dj]φ(d)mn=2d=1mφ(d)(j=1n[dj](i=1m[di]))mn=2d=1mφ(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=1Nj=1Nk=1N[(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=1Nj=1Nk=1N[(i,j,k)=1]=i=1Nj=1Nk=1Nd=1N[di][dj][dk]μ(d)=d=1Nμ(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=1Nμ(d)[dN]3对于每个询问 O ( N ) O(\sqrt N) O(N )计算即可。总复杂度 O ( T N ) O(T\sqrt N) O(TN )


未完待续。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值