• 【算法专题】积性函数


    【参考】

    浅谈一类积性函数的前缀和 by skywalkert

    任之洲数论函数.pdf

    论逗逼的自我修养之寒假颓废记 by jiry_2

    杜教筛 [学习笔记]【更新中】 by Candy?

    【变化技巧总结】

    总结下面所有知识含有的变化技巧

    1.先枚举gcd值。

    2.莫比乌斯反演处理gcd,[gcd(x,y)=1]=Σd|i^d|jμ(d),然后将d提到最前面。

    3.★分块取值优化,ans=Σf(d)*g(n/d),其中g(n/d)只有2√n种取值,预处理f(d)的前缀和即可O(√n)。

    4.多组询问时,对于ΣdΣe,令T=de,则ΣTΣd|T,后面枚举倍数贡献可以O(n ln n)预处理前缀和。

    5.杜教筛:倍数和总数互换,即

    $sum_{i=1}^{n}(f*g)(i)=sum_{i=1}^{n}sum_{d|i}f(d)g(frac{i}{d})=sum_{i=1}^{n}sum_{d=1}^{frac{n}{i}}f(d)g(i)=sum_{i=1}^{n}g(i)F(frac{n}{i})$

    用这个变化,对于卷积f*g=h,知二求一。

    6.函数为加法时,可以分别统计前缀和再相加,但乘法必须一起统计。

    例题:【51nod】1238 最小公倍数之和 V3 杜教筛

    1.相同的完全积性函数卷积有奇效(在这题是同阶幂函数卷积)。

    2.矩阵转上三角,就可以变成积性函数前缀和的形式。

    3.狄利克雷卷积有交换律,结合律,加法分配律。点乘有卷积分配律,即a(b*c)=ab*ac。

    4.φ也可以化简[(n,i)=1],不一定用μ。

    例题:【Project Euler】530 GCD of Divisors 莫比乌斯反演

    1.对于[(a,b)=d],可以将共有因子d提出来并压缩枚举空间。

    2.约数个数前缀和可以O(√n),看到可以转化过去。

    3.两个Σ1~n,可以合并为枚举乘积,然后变成卷积的形式。

    4.复杂度不一定是看到的那样,要好好分析或好好感受。

    【积性函数】

    积性函数的约数和,前缀和,相互卷积也是积性函数。

    1.f(1)=1。

    2.性质一:对于n=∏pi^ki,有f(n)=∏f(pi^ki)

    性质二:对于完全积性函数,还有f(n)=∏f(pi)^ki以及f(n^k)=f(n)^k

    常见的积性函数:

    1.d(n)=Σd|n 1,表示n的因子个数,即d=1*1

    2.σ(n)=Σd|n d,表示n的因子和,即σ=1*id

    3.1(n)=1,恒等函数

    4.id(n)=n,单位函数

    5.e(n)=[n=1],元函数,即f=f*e

    6.φ(n)=Σ[(n,i)=1]*1,欧拉函数

    φ*1=id

    7.μ(n),莫比乌斯函数,μ(n)=(-1)^k,k为n的素因子个数,有重复素因子时μ=0

    μ*1=e

    【狄利克雷卷积】

    定义两个数论函数f,g的狄利克雷卷积:(f*g)(n)=Σd|nf(d)*g(n/d)。

    1.莫比乌斯函数,e(n)=Σd|nμ(d),即e=μ*i。

    莫比乌斯反演,由g=f*i,得f=g*μ。(可以看出μ和1互为逆元)

    证明:f=g*μ=f*i*μ=f*e=f。

    即由g(n)=Σd|nf(d),得f(n)=Σd|ng(d)*μ(n/d)。

    类似的,由g(n)=Σn|df(d),得f(n)=Σn|dg(d)*μ(d/n)。

    $$sum_{d|n}mu(d)=[n=1] (mu imes 1=e)$$

    2.欧拉函数,n=Σd|nφ(d),即id=φ*i。

    $$sum_{d|n}varphi(d)=n (varphi imes 1=id)$$

    证明:考虑n的所有数字x∈[1,n],有(n,x)=d即(n/d,x/d)=1,所以满足(n,x)=d的所有的x的个数为φ(n/d),那么所有n的因子的φ就是答案。

    由反演得,φ=id*μ,即φ(n)/n=Σd|nμ(d)/d。

    $$varphi(n)=sum_{d|n}frac{n}{d}*mu(d) (mu imes id=varphi)$$

    公式:1~n中与n互质的整数和是为( n*φ(n)+[n=1] )/2,证明:gcd(n,i)=gcd(n,n-i),所以互素数总是成对出现。(但约数和不是n*(n+1)/2-n*φ(n)/2+1……)。

    莫比乌斯反演

    【和式Σ变换技巧】

    基本法则(具体数学):

    1.分配律,Σkc*ak=c*Σkak,即提出与Σ无关的乘数。

    2.结合律,将相邻Σ的条件结合或分离。

    3.交换律,即Σ的枚举可以改变顺序。

    4.一般分配律,Σj,kaj*bk=(Σaj)*(Σbk)

    5.多重交换律,当相邻Σ枚举域相关时,需满足:

    [j∈J][k∈K(j)]=[k∈K'][j∈J'(k)]

    通常J=K'是所有整数集合,第二重根据操控二重和式性质的p(j,k)推出。

    6.换元,即更换Σ的枚举元。

    7.艾弗森约定,即将Σ底端限制变成条件,如Σi∈Ii = Σi*[i∈I]。

    【杜教筛】

    参考:浅谈一类积性函数的前缀和 by skywalkert

    给定数论函数$f(n)$,求$s(n)=sum_{i=1}^{n}f(i)$。

    考虑找到一个合适的数论函数$g(n)$。

    杜教筛基本变化(总值与倍数互换)

    $$sum_{i=1}^{n}(f*g)(i)=sum_{i=1}^{n}sum_{d|i}f(d)g(frac{i}{d})=sum_{i=1}^{n}g(i)s(frac{n}{i})$$

    最终

    $$g(1)s(n)=sum_{i=1}^{n}(f*g)(i)-sum_{i=2}^{n}g(i)s(frac{n}{i})$$

    本质上是构造卷积h=f*g,若h和g的前缀和可以O(1)或O(√n)快速求解,则可以用上式快速求解f的前缀和。

    最后将f的前n^(2/3)项预处理,总复杂度O(n^(2/3))。

    求N和N/i时,s(i)记忆化到f[N/i]中,f[]数组大小只需要√N。(N变化时要清空数组)

    例题:【51nod】1239 欧拉函数之和 求Σφ(i)

    复杂度证明:

    根据(x/a)/b=x/(ab),杜教筛只用到2√n个值,所以杜教筛的复杂度是:

    $$sum_{i=1}^{sqrt n}O(sqrt i)+sum_{i=1}^{sqrt n}O(sqrt{frac{n}{i}})$$

    计算复杂度需要用到积分:

    $$int_{0}^{a}x^n=frac{1}{n+1}a^{n+1}$$

    所以,前半部分的复杂度:

    $$sum_{i=1}^{sqrt n}O(sqrt i)=int_{0}^{sqrt n}x^frac{1}{2}approx sqrt n^{frac{1}{2}+1}=O(n^{frac{3}{4}})$$

    后半部分的复杂度:(把√n提出来,最后是n^(3/4))

    $$sum_{i=1}^{sqrt n}O(frac{1}{sqrt i})=int_{0}^{sqrt n}x^{-frac{1}{2}}approx sqrt n^{-frac{1}{2}+1}=O(n^{frac{1}{4}})$$

    最终,复杂度$O(n^{frac{3}{4}})$,预处理前2/3项后复杂度为$O(n^{frac{2}{3}})$。(这暂时不太清楚)

  • 相关阅读:
    webpack从零的实践(新手良药)
    throttle和debounce
    call(),apply(),bind() 区别和用法
    vue 路由钩子。
    vue 兄弟组件之间的传值
    JS 面向对象封装 无限轮播 插件。
    element-ui 解决 table 里包含表单验证的问题!
    Vue.nextTick 的原理和用途
    JavaScript中基本数据类型和引用数据类型的区别
    PS批量修改照片大小
  • 原文地址:https://www.cnblogs.com/onioncyc/p/8461267.html
Copyright © 2020-2023  润新知