狄利克雷卷积&莫比乌斯反演总结

Prepare

1、\([P]\)表示当\(P\)为真时\([P]\)为\(1\),否则为\(0\)。

2、\(a|b\)指\(b\)被\(a\)整除。

3、一些奇怪常见的函数:

\(1(n)=1\)

\(id(n)=n\)

\(\sigma(n)=n的约数和\)

\(d(n)=n的约数个数\)

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

狄利克雷卷积

数论函数

数论函数指一类定义域是正整数,值域是一个数集的函数。

加法:逐项相加就可以辣\((f+g)(x)=f(x)+g(x)\)

数乘:用一个常数乘\((xf)(n)=x*f(n)\)

狄利克雷卷积

定义两个数论函数的狄利克雷卷积\(*\):

若\(t=f*g\)则

\[t(n)=\sum_{i|n}f(i)g(\frac{n}{i})
\]

等价于

\[t(n)=\sum_{ij=n}f(i)g(j)
\]

狄利克雷卷积有以下性质(两个数论函数相等,是指两个函数的每一项都相等):

1、交换律\(f*g=g*f\)

2、结合律\(f*(g*h)=(f*g)*h\)

3、分配律\(f*h+g*h=(f+g)*h\)

4、没有名字\((xf)*g=x(f*g)\)

5、单位元\(\epsilon*f=f\),其中\(\epsilon(n)=[n==1]\)

6、逆元:对于每一个\(f(1)\neq 0\)的函数\(f\),都有\(f*g=\epsilon\)

讨论一下第六个结论,如何求一个函数的逆呢?

只需要定义

\[g(n)=\frac{1}{f(1)}\left([n==1]-\sum_{i|n,i\neq 1}f(i)g(\frac{n}{i})\right)
\]

这样的话

\[\sum_{i|n}f(i)g(\frac{n}{i})=f(1)g(n)+\sum_{i|n,i\neq1}f(i)g(\frac{n}{i})=[n==1]
\]

积性函数

如果一个数论函数\(f\)有当\(gcd(n,m)==1\)时

\[f(nm)=f(n)f(m)
\]

就称\(f\)为积性函数。

一些常见的积性函数:

\(\epsilon(n)=[n==1]\),\(id(n)=n\),\(id^{k}(n)=n^k\)

事实上他们也满足完全积性(即当\(gcd(n,m)\neq1\)时,也有\(f(nm)=f(n)f(m)\))

特殊的,我们令\(id^0(n)=1(n)=1\)

还有两个普通的积性函数

\(d(n)=n的约数和\)、\(\varphi(n)=[1,n]中与n互质的数的个数\)

还有两个重要结论:

两个积性函数的狄利克雷卷积是积性函数。

积性函数的逆是积性函数。

积性函数有什么用呢?

它可以线性筛

然而还有更有用的\(---\)

莫比乌斯反演

一些理论

我们定义\(1\)的逆是\(\mu\)

这样的话,如果\(g=f*1\),就有\(f=f*1*\mu=g*\mu\)

换句话说,就是

\[g(n)=\sum_{d|n}f(d)\Leftrightarrow f(n)=\sum_{d|n}\mu(\frac{n}{d})g(d)
\]

也可以这样子

\[g(d)=\sum_{d|n}f(n)\Leftrightarrow f(d)=\sum_{d|n}\mu(\frac{n}{d})*g(n)
\]

例子

怎么用呢?举几个例子(以下情况默认\(n\leq m\))


\(Eg1\)

\[\sum_{i=1}^n\sum_{i=1}^m[gcd(i,j)==1]
\]

然后怎么办呢?

\[f(x)=\sum_{i=1}^n\sum_{i=1}^m[gcd(i,j)==x] \\
g(x)=\sum_{x|d}f(d)
\]

\[f(1)=\sum_{1|d}\mu(\frac{d}{1})g(d) \\
f(1)=\sum_{i=1}^n\mu(i)g(i)
\]

考虑\(g(x)\)是什么

\[g(x)=\sum_{x|d}\sum_{i=1}^n\sum_{i=1}^m[gcd(i,j)==d]
\]

\[g(x)=\sum_{i=1}^n\sum_{i=1}^m[x|gcd(i,j)] \\
g(x)=\sum_{i=1}^{\left\lfloor\frac nx\right\rfloor}\sum_{i=1}^{\left\lfloor\frac mx\right\rfloor}[1|gcd(i,j)]\\
g(x)=\left\lfloor\frac nx\right\rfloor\left\lfloor\frac mx\right\rfloor
\]

带回\(f(1)\)

\[Ans=\sum_{x=1}^n\mu(x)\left\lfloor\frac nx\right\rfloor\left\lfloor\frac mx\right\rfloor
\]

这个用整除分块可以做到\(O(\sqrt n)\)


\(Eg2\)

\[\sum_{i=1}^n\sum_{j=1}^mgcd(i,j)
\]

可化为

\[\sum_{d=1}^n\sum_{i=1}^n\sum_{j=1}^md[gcd(i,j)==d] \\
\sum_{d=1}^nd\sum_{i=1}^{\left\lfloor\frac nd\right\rfloor}\sum_{j=1}^{\left\lfloor\frac md\right\rfloor}[gcd(i,j)==1]
\]

\[x=\left\lfloor\frac nd\right\rfloor, y=\left\lfloor\frac md\right\rfloor
\]

\[\sum_{d=1}^nd\sum_{i=1}^x\sum_{j=1}^y[gcd(i,j)==1]
\]

套入我们刚才在\(Eg1\)求得的

\[\sum_{d=1}^nd\sum_{i=1}^x\mu(i)\left\lfloor\frac xi\right\rfloor\left\lfloor\frac yi\right\rfloor\\
\sum_{d=1}^nd\sum_{i=1}^{n/d}\mu(i)\left\lfloor\frac {x}{id}\right\rfloor\left\lfloor\frac {y}{id}\right\rfloor
\]

化到现在是\(O(n)\)的,因为前后都可以数论分块

但是我们能做得更好

令\(T=id\)

原式化为

\[\sum_{d=1}^nd\sum_{i=1}^n\mu(i)\left\lfloor\frac {x}{T}\right\rfloor\left\lfloor\frac {y}{T}\right\rfloor\\
\sum_{T=1}^n\left\lfloor\frac {x}{T}\right\rfloor\left\lfloor\frac {y}{T}\right\rfloor\sum_{d|T}d\mu(\frac Td)
\]

乍一看还是\(O(n)\)的呀,但是对于后面那一坨

\[f(T)=\sum_{d|T}d\mu(\frac Td)\\
\Leftrightarrow\\
f(T)=\sum_{ij=T}id(i)\mu(j)
\]

两个积性函数相乘,可以线性筛呀!!

所以复杂度被我们压到了\(O(\sqrt n)\)

\(upd\;on\;2019.3.9:\)

发现以前没有讲线性筛,导致现在自己都不知道是怎么搞得了。。。

线性筛

我们筛\(\mu\)的函数是长这样的(自动认为有模数):

int prime[MAX_N], mu[MAX_N]
bool nprime[MAX_N];
void sieve() {
mu[1] = 1;
for (int i = 2; i <= N; i++) {
if (!nprime[i]) prime[++tot] = i, mu[i] = Mod - 1;
for (int j = 1; i * prime[j] <= N; j++) {
nprime[i * prime[j]] = 1;
if (i % prime[j] == 0) break;
mu[i * prime[j]] = Mod - mu[i];
}
}
}

其实就是和筛素数的是一样的,

if (i % prime[j] == 0) break;

这句话保证了复杂度,因为你存的素数是递增的,

如果\(i\)被\(prime[j]\)整除后,\(i*prime[j+k](k>0)\)一定可以被\(prime[j]*x\)的形式表示出来。

那么就有我们下面的一个问题:


\(Eg3\)

给定你一个数组\(f\),求

\[\sum_{i=1}^n\sum_{j=1}^mf[gcd(i,j)]
\]

其中\(n,m\leq 10^7\),数据组数\(T\leq 10^4\)。

由我们上面推的东西,将\(f\)看作一个数论函数,可以知道只要求出一个函数\(g=\mu * f\)的前缀和,

这个问题就解决了。

一下是解决这个问题的几种方法(蒯的):

void get_g_1(int N, const int *f, int *g) {
for (int i = 1; i <= N; i++) g[i] = 0;
for (int i = 1; i <= N; i++)
for (int j = 1; i * j <= N; j++)
g[i * j] = (g[i * j] + mu[i] * f[j]) % mod;
} // 依照定义,O(nlogn) void get_g_2(int N, const int *f, int *g) {
for (int i = 1; i <= N; i++) g[i] = f[i];
for (int i = 1; i <= N; i++)
for (int j = 2; i * j <= N; j++)
g[i * j] = (g[i * j] - g[i]) % mod;
} // 类似求狄利克雷卷积逆的方式,不需要线性筛 mu ,O(nlogn) void get_g_3(int N, const int *f, int *g) {
for (int i = 1; i <= N; i++) g[i] = f[i];
for (int i = 0; i < prime_count; i++)
for (int j = N / prime[i]; j >= 1; j--)
g[j * prime[i]] = (g[j * prime[i]] - g[j]) % mod;
} // Magic! O(nloglogn)

对于最后一种方法,理解成dp:

\[g_{i,n}=\sum_{d|n,d只包含前i种质因子}\mu(d)f(n/d)
\]

那么转移:

\[g_{i,n}=\begin{cases}
g_{i-1,n}\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;p_i\nmid n\\
g_{i-1,n}-g_{i-1,n/p_i}\;\;\;\;\;p_i\mid n
\end{cases}
\]

复杂度\(O(n\log\log n)\)。


参考文章1

参考文章2

狄利克雷卷积&莫比乌斯反演总结的更多相关文章

  1. 狄利克雷卷积&莫比乌斯反演证明

    狄利克雷卷积简介 卷积这名字听起来挺学究的,今天学了之后发现其实挺朴实hhh. 卷积: "(n)"表示到n的一个范围. 设\(f,g\)是两个数论函数(也就是说,以自然数集为定义域 ...

  2. 狄利克雷卷积 & 莫比乌斯反演

    积性函数与完全积性函数 积性函数 若一个数论函数\(f\)满足当\(gcd(n,m)=1\)时,\(f(nm)=f(n)f(m)\) 则称\(f\)为积性函数 一些常见的积性函数 完全积性函数 若一个 ...

  3. 狄利克雷卷积&莫比乌斯反演

    昨天刚说完不搞数论了,刚看到一个\(gcd\)的题目dalao用这个做了,虽然比正解麻烦,还是打算学一学了 数论函数: 数论函数的定义: 数论函数亦称算术函数,一类重要的函数,指定义在正整数集上的实值 ...

  4. 中国剩余定理 & 欧拉函数 & 莫比乌斯反演 & 狄利克雷卷积 & 杜教筛

    ssplaysecond的博客(请使用VPN访问): 中国剩余定理: https://ssplaysecond.blogspot.jp/2017/04/blog-post_6.html 欧拉函数: h ...

  5. 我也不知道什么是"莫比乌斯反演"和"杜教筛"

    我也不知道什么是"莫比乌斯反演"和"杜教筛" Part0 最近一直在搞这些东西 做了将近超过20道题目吧 也算是有感而发 写点东西记录一下自己的感受 如果您真的 ...

  6. 【BZOJ3529】数表(莫比乌斯反演,树状数组)

    [BZOJ3529]数表(莫比乌斯反演,树状数组) 题解 首先不管\(A\)的范围的限制 要求的东西是 \[\sum_{i=1}^n\sum_{j=1}^m\sigma(gcd(i,j))\] 其中\ ...

  7. 【Luogu3768】简单的数学题(莫比乌斯反演,杜教筛)

    [Luogu3768]简单的数学题(莫比乌斯反演,杜教筛) 题面 洛谷 \[求\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\] $ n<=10^9$ 题解 很明显的把\( ...

  8. [复习]莫比乌斯反演,杜教筛,min_25筛

    [复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...

  9. 【51NOD 1847】奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数)

    [51NOD 1847]奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数) 题面 51NOD \[\sum_{i=1}^n\sum_{j=1}^nsgcd(i,j)^k\] 其中\( ...

随机推荐

  1. Android项目实战(四十九):Andoird 7.0+相机适配

    解决方案类似: Android项目实战(四十):Andoird 7.0+ 安装APK适配 解决方法: 一.在AndroidManifest.xml 文件中添加 四大组件之一的 <provider ...

  2. WiFi的名词缩写

    http://blog.csdn.net/jayxujia123/article/details/12842295 无线网络最初采用的安全机制是WEP(有线等效私密),但是后来发现WEP是很不安全的, ...

  3. 简单 PHP + MySQL 数据库动态网站制作 -- 摘抄

    在这篇文章中,我尽量用最浅显易懂的语言来说明使用 PHP, MySQL 制作一个动态网站的基本技术.阅读本文需要简单的 HTML 基础知识和(任一编程语言的)编程基础知识(例如变量.值.循环.语句块的 ...

  4. mysql之连接查询、联合查询、子查询

    本文内容: 连接查询 联合查询 子查询 from子查询 where子查询 exists子查询 首发日期:2018-04-11 连接查询: 连接查询就是将多个表联合起来查询,连接查询方式有内连接.外连接 ...

  5. CentOS 安装开发环境 并安装coTurn

    从官网 https://www.centos.org/download/ 下载镜像文件 从163的镜像站点下载,速度较快 http://mirrors.163.com/centos/7/isos/x8 ...

  6. SqlServer跨集群升级

    SqlServer跨集群升级 1.新Server的IP要和旧的在同一网段. 2.安装SQL SERVER(注意:排序要和以前的一样,更改TempDB位置) 3.开启防火墙,并打开1433和5022端口 ...

  7. java 根据实体对象生成 增删改的SQL语句 ModelToSQL

    package com.xxx.utils; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import jav ...

  8. c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法

    c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...

  9. RHEL/Centos7 安装图形化桌面

    Linux是一个多任务的多用户的操作系统,好多linux爱好者在安装完linux后经常遇到一个问题——没有图形化桌面.今天小编在安装RHEL7的时候,一步留神没有安装图形化桌面,下面分享一下安装图形化 ...

  10. 【算法】LeetCode算法题-Implement strStr

    这是悦乐书的第151次更新,第153篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第10题(顺位题号是28).给定两个任意字符串haystack.needle,返回hay ...