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

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 Service、IntentService,Service和组件间通信

    Service组件 Service 和Activity 一样同为Android 的四大组件之一,并且他们都有各自的生命周期,要想掌握Service 的用法,那就要了解Service 的生命周期有哪些方 ...

  2. 【Spring源码解读】bean标签中的属性(二)你可能还不够了解的 abstract 属性和 parent 属性

    abstract 属性说明 abstract 在java的语义里是代表抽象的意思,用来说明被修饰的类是抽象类.在Spring中bean标签里的 abstract 的含义其实也差不多,表示当前bean是 ...

  3. Percona XtraBackup 备份还原篇

    Percona XtraBackup 安装介绍篇已经对Percona XtraBackup的功能和安装做了比较详细的介绍,那么本篇我们直接进入主题,如何使用XtraBackup做备份.还原,下面主要介 ...

  4. mssql sql server 系统更新,如何正确的增加表字段

    转自: http://www.maomao365.com/?p=5277摘要:下文主要讲述,如何对"已上线的系统"中的表,增加新的字段. 系统部署脚本,增加列的方法:在系统脚本发布 ...

  5. jvm程序执行慢诊断手册

    生产环境最多的几种事故之一就是程序执行慢,如果是web服务的话,表现就是响应时间长.本文分享,从业多年形成的排查守则. 诊断步骤 系统资源查看 首先是系统资源查看,而且必须是在第一步.因为很多事故都是 ...

  6. SSM 框架 ---项目整合

    一.SSM框架理解 Spring(业务层) Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象. Spring的核心思想是IoC(控 ...

  7. 【PAT】B1012 数字分类

    注意逻辑的描述,只要认真看题,就能做对,如果自己结果一直不正确,请仔细推一下样例结果 #include<stdio.h> int arr[1005]; int main(){ int N, ...

  8. celery 定时任务

    用celery定时任务,定时删除文件夹 tasks.py from celery import Celery import os import shutil app = Celery('demo') ...

  9. 2802:小游戏利用bfs来实现

    之前使用的是递归的方法来解决的问题,后来有点想用bfs(宽度优先搜索来尝试一下的想法,在网上看到有人使用了dfs(深度优先搜索)更加坚定了自己的这种想法. 这个方法首先是以顶点的四组开始,加入那些没有 ...

  10. CISCO 动态路由(OSPF)

    OSPF(开放式最短路径优先):是一个内部网关协议(Interior Gateway Protocol,简称IGP),用于在单一自治系统(autonomous system,AS)内决策路由.是对链路 ...