zoukankan      html  css  js  c++  java
  • 莫比乌斯反演学习笔记

    其实这些东西早在9月就学了,然而那时理解还不是很清楚。今天上课正式讲到,就来把这个坑填上,主要是复习不熟悉的东西了。

    首先先明确几个数论函数:

    欧拉函数(φ):φ(n)表示1~n中与n互质的数的个数

    莫比乌斯函数(μ):μ(1)=1,若n(n>1)含有多重质因数,则μ(n)=0,否则 μ(n)=(-1)r,r表示n的质因数个数

    常函数(1):∀n∈N,1(n)=1

    单位函数(id):∀n∈N,id(n)=n

    幂函数(idk):∀n∈N,idk(n)=nk

    狄利克雷卷积单位函数(ε):ε(1)=1,∀n>1,ε(n)=0

    元函数(e):这是一个由命题映射到N的特殊函数,e[P]=1当且仅当P为真,否则e[P]=0

    除数函数(σ):一类函数,每个非负整数x都对应一个除数函数σx,σx(n)表示 n的因数的x次方之和

    还有一个定义:

    狄利克雷卷积函数:(fxg)(n) = sigma(d|n)f(d)g(n/d)。

    这些是基本的前置技能了,如果不明白,请反复阅读直到理解为止。

    然后我们有4个关于以上函数的结论:

    φ x 1 = id,证明:若n为质数,则id。其他情况用积性函数证明。

    μ x id = φ,这个以后能够证明。

    μ x 1 = ε,证明:考虑每个质数选几个,用二项式定理确定系数,带进去后发现和为0。

    ε × 1 = 1,证明:每个数为1的因数只有1,显然。

    注意这里的x都表示求狄利克雷卷积。

    通过以上的结论(μ x 1 = 1,ε × 1 = 1),我们猜想对于一般的积性函数(f(x),g(x)),是否存在:f × 1 = g↔μ × g = f

    这个是正确的,证明如下:

    考虑从左到右:

    考虑从右到左:

    至此莫比乌斯反演基本定理得证。

    根据以上的证明我们可以总结出一些小技巧:

    1. 四个卷积结论:φ×1=id、μ×id=φ、μ×1=ε、ε×1=1(需要注意的是,更多的时候是从右到左的应用)
    2. 分块的前提结论:∀n,d∈N,n/d向下取整至多有√n种取值
    3. gcd与lcm相关:gcd(a,b)*a*b=lcm(a,b),d|gcd(a,b)→d|a且d|b
    4. 交换求和号的方法技巧,以及常见的求和号交换法
    5. 对于多次询问的题目,预处理积性函数的值与前缀和

    具体的用法还得在题目中说明。

    当然了,如果面对多次询问φ(n)与μ(n)的值与前缀和可以预处理出来,而N/d向下取整M/d向下取整分别最多有和种取值,所以说我们只用枚举这两部分的取值,中间整块的部分用前缀和相减即得积性函数的和。

    时间复杂度:O(min(N,M)+T(+)),其中T表示数据组数。

    代码实现:

    1 int t = min(n, m), ans = 0;
    2 for (int i = 1, j = 1; i <= t; i = j + 1) {
    3     j = min(n / ( n / i), m / (m / i));
    4     ans += (summu[j] - summu[i - 1]) * (n / i) * (m / j);
    5 }

    然后就是具体的题目了,不想多写了,插入公式实在太费劲了QAQ。(留坑以后再说!)

    说白了就是本蒟蒻太弱了不会用LaTeX,被迫用Word2016做了半天公式后心态爆炸了……

  • 相关阅读:
    react-redux: counter
    react table dropdown
    react pagination
    react privateRoute
    分布式爬虫(2)
    CentOS安装Python3.x
    spark复习笔记(3):使用spark实现单词统计
    《快学scala》读书笔记(2)
    《快学scala》读书笔记(1)
    spark复习笔记(2)
  • 原文地址:https://www.cnblogs.com/Cmd2001/p/8053477.html
Copyright © 2011-2022 走看看