狄利克雷卷积&莫比乌斯反演总结
狄利克雷卷积&莫比乌斯反演总结
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\)则
\]
等价于
\]
狄利克雷卷积有以下性质(两个数论函数相等,是指两个函数的每一项都相等):
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\)
讨论一下第六个结论,如何求一个函数的逆呢?
只需要定义
\]
这样的话
\]
积性函数
如果一个数论函数\(f\)有当\(gcd(n,m)==1\)时
\]
就称\(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\)
换句话说,就是
\]
也可以这样子
\]
例子
怎么用呢?举几个例子(以下情况默认\(n\leq m\))
\(Eg1\)
求
\]
然后怎么办呢?
设
g(x)=\sum_{x|d}f(d)
\]
则
f(1)=\sum_{i=1}^n\mu(i)g(i)
\]
考虑\(g(x)\)是什么
\]
即
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)\)
\]
这个用整除分块可以做到\(O(\sqrt n)\)
\(Eg2\)
求
\]
可化为
\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]
\]
设
\]
则
\]
套入我们刚才在\(Eg1\)求得的
\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_{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)\)的呀,但是对于后面那一坨
\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\),求
\]
其中\(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-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)\)。
狄利克雷卷积&莫比乌斯反演总结的更多相关文章
- 狄利克雷卷积&莫比乌斯反演证明
狄利克雷卷积简介 卷积这名字听起来挺学究的,今天学了之后发现其实挺朴实hhh. 卷积: "(n)"表示到n的一个范围. 设\(f,g\)是两个数论函数(也就是说,以自然数集为定义域 ...
- 狄利克雷卷积 & 莫比乌斯反演
积性函数与完全积性函数 积性函数 若一个数论函数\(f\)满足当\(gcd(n,m)=1\)时,\(f(nm)=f(n)f(m)\) 则称\(f\)为积性函数 一些常见的积性函数 完全积性函数 若一个 ...
- 狄利克雷卷积&莫比乌斯反演
昨天刚说完不搞数论了,刚看到一个\(gcd\)的题目dalao用这个做了,虽然比正解麻烦,还是打算学一学了 数论函数: 数论函数的定义: 数论函数亦称算术函数,一类重要的函数,指定义在正整数集上的实值 ...
- 中国剩余定理 & 欧拉函数 & 莫比乌斯反演 & 狄利克雷卷积 & 杜教筛
ssplaysecond的博客(请使用VPN访问): 中国剩余定理: https://ssplaysecond.blogspot.jp/2017/04/blog-post_6.html 欧拉函数: h ...
- 我也不知道什么是"莫比乌斯反演"和"杜教筛"
我也不知道什么是"莫比乌斯反演"和"杜教筛" Part0 最近一直在搞这些东西 做了将近超过20道题目吧 也算是有感而发 写点东西记录一下自己的感受 如果您真的 ...
- 【BZOJ3529】数表(莫比乌斯反演,树状数组)
[BZOJ3529]数表(莫比乌斯反演,树状数组) 题解 首先不管\(A\)的范围的限制 要求的东西是 \[\sum_{i=1}^n\sum_{j=1}^m\sigma(gcd(i,j))\] 其中\ ...
- 【Luogu3768】简单的数学题(莫比乌斯反演,杜教筛)
[Luogu3768]简单的数学题(莫比乌斯反演,杜教筛) 题面 洛谷 \[求\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\] $ n<=10^9$ 题解 很明显的把\( ...
- [复习]莫比乌斯反演,杜教筛,min_25筛
[复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...
- 【51NOD 1847】奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数)
[51NOD 1847]奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数) 题面 51NOD \[\sum_{i=1}^n\sum_{j=1}^nsgcd(i,j)^k\] 其中\( ...
随机推荐
- Python异常处理机制、调试、测试
类似于Java的try..catch..finally Java的为try_except_finally try: print('try...') r = / print('result:', r) ...
- SQL语句(floor、ceiling和round以及left和right)
前言:个人认为命令没有必要记,学过的知识总结一下,用到了可以快速找到派上用场.用的多了,自然会记住,但是一定要理解每一个字符代表的是什么,多一个少一个会怎么样 要点概述 floor 和ceiling和 ...
- Selenium Webdriver 中的 executeScript 使用方法
1.使用executeScript 返回一个WebElement . 下例中我们将一个浏览器中的JavaScript 对象返回到客户端(C#,JAVA,Python等). IWebElement el ...
- Ubuntu下永久修改主机名和创建用户
使用hostname 进行修改. 创建用户,修改密码
- session 详细解析(转)
转自 https://www.cnblogs.com/blueskycc/p/5524709.html?tdsourcetag=s_pcqq_aiomsg http协议是WEB服务器与客户端(浏览器) ...
- 【转载】Python中的垃圾回收机制
GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来给其他对象使用.GC彻底把程序员从资源管理的重担中解放出来,让他们有更多的时间放在 ...
- python——作用域之LEGB规则
1 变量的作用域 Python是静态作用域,也就是说在Python中,变量的作用域源于它在代码中的位置:在不同的位置,可能有不同的命名空间.命名空间是变量作用域的体现形式. 2 LEGB各自代表的含义 ...
- C语言经典例题(菜鸟教程100例)
学习c语言基础,怎么能少了菜鸟教程上的100道例题呢,这里整理一下每道题的链接,希望大家能享受学习的乐趣 1,有1,2,3,4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 2,企业发放 ...
- kafka_2.11-2.0.0_介绍
1. JMS是什么 1.1. JMS的基础 JMS是什么:JMS是Java提供的一套技术规范 JMS干什么用:用来异构系统 集成通信,缓解系统瓶颈,提高系统的伸缩性增强系统用户体验,使得系统模块化和组 ...
- centos7 多网卡绑定bond0 之mod4
什么是mod4 mod=4,即:(802.3ad) IEEE 802.3ad Dynamic link aggregation(IEEE 802.3ad 动态链接聚合) 特点:创建一个聚合组,它们共享 ...