zoukankan      html  css  js  c++  java
  • 总结「积性函数和筛法」

    定义

    若函数 (f(n)) 满足 (f(1)=1)(forall x,y in {Bbb{N}}_{+},{ m{gcd}}(x,y)=1) 都有 (f(xy)=f(x)f(y)) ,则 (f) 为积性函数。

    若函数 (f(n)) 满足 (f(1)=1)(forall x,y in {Bbb{N}}_{+}) 都有 (f(xy)=f(x)f(y)) ,则 (f) 为完全积性函数。

    性质

    比较重要的有:若 (f,g) 为积性函数,则满足

    [h(n)=sum_{d|n}f(d)g(frac{n}{d}) ]

    的函数 (h) 也为积性函数。

    函数 (h) 称作 (f,g) 的Dirichlet卷积,记作 (f*g)

    例子

    单位函数

    [epsilon(n)=[n=1] ]

    有:

    [epsilon=mu*{ m{I}} iff epsilon(n)=sum_{d|n}mu(d) ]

    这个式子尤其常用。

    任何函数卷 (epsilon) 都为其本身。

    恒等函数

    [{ m{id}}_k(n)=n^k ]

    一般用 ({ m{id}}) 表示 ({ m{id}}_1)

    常数函数

    [{ m{I}}(n)=1 ]

    在杜教筛中有用到。

    除数函数

    [sigma_k(n)=sum_{d|n}d^k ]

    一般 (sigma_0) 记作 ({ m{d}})(sigma_1) 记作 (sigma)

    对于 (sigma) ,有:

    [sigma={ m{id}}*{ m{I}} iff sigma(n)=sum_{d|n}d ]

    线性筛 ({ m{d}})

    (n=prod_{i=1}^mp_i^{c_i}) ,则根据乘法原理有:

    [{ m{d}}(n)=prod_{i=1}^m(c_i+1) ]

    • 对于质数 (p) ,有 ({ m{d}}(p)=2)
    • 对于 (a,b) 满足 (aot b) ,有 ({ m{d}}(ab)={ m{d}}(a){ m{d}}(b))
    • 对于质数 (p) 与合数 (a) 满足 (p|a) ,设 (c)(p)(pa) 中的次数,有 ({ m{d}}(pa)={ m{d}}(a)frac{c+1}{c})

    于是就可以线性筛了:

    (num_i) 记录 (i) 的最小质因子的次数。

    inline void sieve()
    {
        d[1]=1;
        for(int i=2;i<=N;++i)
        {
            if(!flag[i]) prime[++cnt]=i,d[i]=2,num[i]=1;
            for(int j=1;j<=cnt&&i*prime[j]<=N;++j)
            {
                flag[i*prime[j]]=true;
                if(i%prime[j])
                {
                    num[i*prime[j]]=1;
                    d[i*prime[j]]=d[i]*2;
                }
                else
                {
                    num[i*prime[j]]=num[i]+1;
                    d[i*prime[j]]=d[i]/num[i*prime[j]]*(num[i*prime[j]]+1);
                    break;
                }
            }
        }
    }
    
    线性筛 (sigma)

    由乘法原理得:

    [sigma(n)=prod_{i=1}^msum_{j=0}^{c_i}p_i^j ]

    (f) 记录约数和,(g) 记录最小质因子 (p)(sum_{i=0}^{c}p^i) 。则有:

    • 对于质数 (p) ,有 (f(p)=1+p,g(n)=1+p)
    • 对于 (a,b) 满足 (a ot b) ,且 (ab) 的最小质因子为 (p) ,有 (f(ab)=f(a)f(b),g(ab)=sum_{i=0}^{c}p^i)
    • 对于质数 (p) 和合数 (a)(p)(a) 的最小质因子,有 (g(pa)=g(a) imes p+1,f(pa)=f(a)frac{g(pa)}{g(a)})
    inline void sieve()
    {
        f[1]=g[1]=1;
        for(int i=2;i<=N;++i)
        {
            if(!flag[i]) prime[++cnt]=i,f[i]=g[i]=1+i;
            for(int j=1;j<=cnt&&i*prime[j]<=N;++j)
            {
                flag[i*prime[j]]=true;
                if(i%prime[j])
                {
                    f[i*prime[j]]=f[i]*f[prime[j]];
                    g[i*prime[j]]=1+prime[j];
                }
                else
                {
                    g[i*prime[j]]=g[i]*prime[j]+1;
                    f[i*prime[j]]=f[i]/g[i]*g[i*prime[j]];
                    break;
                }
            }
        }
    }
    

    欧拉函数

    [varphi(n)=sum_{i=1}^n[iot n] ]

    (n=prod_{i=1}^mp_i^{c_i}) ,则有通式:

    [varphi(n)=n imes prod_{i=1}^mfrac{p_i-1}{p_i} ]

    有:

    [varphi * { m{I}}={ m{id}} ]

    证明:

    因为 (varphi) 是积性函数,所以只需要证明 (n=p^c) 的情况,即证明:

    [(varphi*{ m{I}})(n)=sum_{d|n}varphi(d)={ m{id}}(n) ]

    因为 (n=p^c) 所以 (d=1,p,p^2,p^3 cdots,p^c) ,将上式改为枚举 (p) 的次数:

    [egin{align} sum_{d|n}varphi(d)&=sum_{i=0}^cvarphi(p^i)\ &=1+p^0(p-1)+p^1(p-1)+cdots+p^{c-1}(p-1)\ &=p^c\ &={ m{id}}(n) end{align} ]

    上面用到了欧拉函数的性质: (varphi(p^c)=p^{c-1}(p-1))

    (varphi*{ m{I}}={ m{id}}) 得证。

    线性筛 (varphi)
    • 对于质数 (p) ,有 (varphi(p)=p-1)
    • 对于 (a,b) 满足 (aot b) ,有 (varphi(ab)=varphi(a)varphi(b))
    • 对于质数 (p) 和数 (a) 满足 (p|a) ,有 (varphi(pa)=varphi(a) imes p)

    对于第三种情况,证明如下:

    因为 (p|a) ,所以 (a) 包含了所有 (pa) 的质因子,则有:

    [egin{align} varphi(pa)&=p imes aprod_{i=1}^mfrac{p_i-1}{p_i}\ &=p imesvarphi(a) end{align} ]

    证毕。

    inline void sieve()
    {
    	phi[1]=1;
    	for(int i=2;i<=N;i++)
    	{
    		if(!flag[i]) prime[++cnt]=i,phi[i]=i-1;
    		for(int j=1;j<=cnt&&prime[j]*i<=N;j++)
    		{
    			flag[prime[j]*i]=true;
    			if(i%prime[j]==0)
    			{
    				phi[prime[j]*i]=phi[i]*prime[j];
    				break;
    			}
    			else phi[prime[j]*i]=phi[i]*(prime[j]-1);
    		}
    	}
    }
    

    莫比乌斯函数

    [mu(n)=egin{cases}1 & n=1\ 0 & exists d>1:d^2|n \ (-1)^{omega(n)} & ext{otherwise}end{cases} ]

    其中 (omega(n)) 表示 (n) 不同质因子个数。

    有:

    [sum_{d|n}mu(d)=epsilon(n) iff epsilon=mu*{ m{I}} ]

    证明:

    (n=prod_{i=1}^mp_i^{c_i},n'=prod_{i=1}^mp_i) ,则:

    [egin{align} sum_{d|n}mu(d)&=sum_{d|n'}mu(d)\ &=sum_{i=0}^m{m choose i} imes 1 imes (-1)^i\ &=(1+(-1))^k\ &=egin{cases}1 & k=0 \ 0 & k ot =0end{cases}\ &=egin{cases}1 & n=1 \ 0 & n ot =1end{cases}\ &=epsilon(n) end{align} ]

    这同时也证明了 (epsilon=mu*{ m{I}})

    证毕。

    与欧拉函数结合,有:

    [varphi=mu*{ m{id}} iff varphi(n)=sum_{d|n}dcdotmu(frac{n}{d}) ]

    证明:

    [varphi*{ m{I}}={ m{id}} iff varphi*{ m{I}}*mu={ m{id}}*mu iff varphi=mu*{ m{id}} ]

    上面用到了 (mu*{ m{I}}=epsilon) 的结论。

    证毕。

    反演结论

    [[{ m{gcd}}(i,j)=1] iff sum_{d|i,d|j}mu(d) ]

    线性筛 (mu)
    • 对于质数 (p) ,有 (mu(p)=-1)
    • 对于 (a,b) 满足 (aot b) ,有 (mu(ab)=mu(a)mu(b))
    • 对于质数 (p) 和整数 (a) 满足 (p|a) ,有 (mu(pa)=0)
    inline void sieve()
    {
        mu[1]=1;
    	for(int i=2;i<=N;++i)
    	{
    		if(!flag[i]) prime[++cnt]=i,mu[i]=-1;
    		for(int j=1;j<=cnt&&i*prime[j]<=N;++j)
    		{
    			flag[i*prime[j]]=true;
    			if(!(i%prime[j])) break;
    			mu[i*prime[j]]=-mu[i];
    		}
    	}
    }
    

    参考资料:

    莫比乌斯反演 - OI Wiki

    筛法 - OI Wiki

  • 相关阅读:
    python定时任务模块APScheduler
    from urllib import parse模块的使用
    go操作空指针导致supervisor进程服务挂机的坑
    docker快速安装rabbitmq
    利用redis的bitmap实现用户签到功能
    linux安装splunk-enterprise
    python封装email模块
    golang模块viper读取配置文件
    Tangram: Optimized Coarse-Grained Dataflow for Scalable NN Accelerators 阅读笔记
    将博客搬至CSDN
  • 原文地址:https://www.cnblogs.com/syc233/p/13550649.html
Copyright © 2011-2022 走看看