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做了半天公式后心态爆炸了……

  • 相关阅读:
    dotnet 控制台读写 Sqlite 提示 no such table 找不到文件
    dotnet 控制台读写 Sqlite 提示 no such table 找不到文件
    dotnet 控制台 Hangfire 后台定时任务
    dotnet 控制台 Hangfire 后台定时任务
    dotnet 获取指定进程的输入命令行
    dotnet 获取指定进程的输入命令行
    PHP sqrt() 函数
    PHP sinh() 函数
    PHP sin() 函数
    PHP round() 函数
  • 原文地址:https://www.cnblogs.com/Cmd2001/p/8053477.html
Copyright © 2011-2022 走看看