莫比乌斯(mobius)笔记
mobius反演的本质是容斥原理,这在《组合数学》里面有提到
基本公式定理
mobius反演公式
F(n)f(n)=∑d∣nf(d)=∑d∣nμ(n/d)F(d)=∑d∣nμ(d)F(n/d)\begin{align}F(n) &= \sum_{d\mid n}f(d)\\f(n)&=\sum_{d\mid n}\mu(n/d)F(d)\\&=\sum_{d\mid n}\mu(d)F(n/d)\\\end{align}
另一种描述:F(d)f(d)=∑d∣nf(n)=∑d∣nF(n)μ(n/d)\begin{align}F(d)&=\sum_{d\mid n}f(n)\\f(d)&=\sum_{d\mid n}F(n)\mu(n/d)\end{align}
经典公式
nϕ(n)∑d∣nμ(d)=∑d∣nϕ(d)=∑d∣nμ(d)nd=(n==d)\begin{align}n &= \sum_{d\mid n}\phi(d)\\\phi(n)&=\sum_{d\mid n}\mu(d)\frac nd\\\sum_{d\mid n}\mu(d) &=(n==d)\end{align}
线性筛
我们可以用线性筛法处理积性函数,简单的说就是用每次用合数最小质因子去筛掉它,这能保证O(n)O(n)的时间复杂度,详细的证明请见文末参考文献。可是对于和性的函数我们也可以这样晒去.
void monius(){cnt =0;mu[1] = 1;memset(prime,0,sizeof(prime));for(int i = 2 ; i<maxn ; ++i){if(!prime[i]){prime[cnt++] = i;mu[i] =-1;}for(int j=0 ; j<cnt && i*prime[j]<maxn ; ++j){prime[i*prime[j]] = 1;if(i%prime[j])mu[prime[j]*i] = -mu[i];else {mu[i*prime[j]] = 0;break;}}}sum_mu[0] = 0;for(int i=1 ; i<maxn ; ++i)sum_mu[i] = sum_mu[i-1]+mu[i];
}
void phi_table(){cnt =0;phi[1] = 0;memset(prime,0,sizeof(prime));for(int i = 2 ; i<maxn ; ++i){if(!prime[i]){prime[cnt++] = i;phi[i] =i-1;}for(int j=0 ; j<cnt && i*prime[j]<maxn ; ++j){prime[i*prime[j]] = 1;if(i%prime[j])phi[prime[j]*i] = phi[i]*(phi[prime[j]]);else {phi[i*prime[j]]= phi[i]*prime[j];break;}}}
}
分块求和
如果说计算式中出现了 ∑if(i)∗g(⌊(n/i)⌋)\sum_if(i)*g(\lfloor(n/i)\rfloor),则由于 ⌊ni⌋\lfloor\frac{n}{i}\rfloor的取值只有 O(n√)O(\sqrt n) 种显然我们可以运用分段求和(可以打印出这样的值来看一下)记录ff的前缀和,然后g就进行分段求和.
这是mobius中的常见的优化.
ll F(int n, int m, int d) {if (n > m) swap(n, m);ll ans = 0;n /= d, m /= d;for (int i = 1, last = 1; i <= n; i = last + 1) {last = min(n / (n / i), m / (m / i));ans += (ll)(sum[last] - sum[i - 1]) * (n / i) * (m / i);}return ans;
}
gcd相关
mobius最广的应用就是gcd相关的求和问题.
∑a≤N,b≤Mgcd(a,b)=1\sum_{a\le N,b\le M}gcd(a,b)=1
令f(d)=:gcd(a,b)=d的个数(a≤N,b≤M),F(d)=:d∣gcd(a,b)的个数f(d)=:gcd(a,b)=d的个数(a\le N,b\le M),F(d)=:d\mid gcd(a,b)的个数.显然有
\begin{align} F(d) &= \lfloor N/d \rfloor*\lfloor M/d \rfloor \\ F(d)&=\sum_{d\mid gcd(a,b)=n}f(n)\\ f(d)&=\sum_{d\mid n}\mu(n/d)F(n)\\ &=\sum_{x=1}^{\lfloor N/d \rfloor}u(x)F(dx)\\ &=\sum_{x=1}^{\lfloor N/d \rfloor}u(x)\lfloor \frac {N}{dx}\rfloor*\lfloor \frac{M}{dx}\rfloor \end{align}
显然将d设为就是求解d为1的问题,同时,若d为1我们也可以将其转化为 ⌊N/d⌋,⌊M/d⌋ \lfloor N/d \rfloor,\lfloor M/d \rfloor规模下d=1的问题.,不过需要说明的问题是我们可以用分块求和这样就能在 n√\sqrt n的复杂度解决这个问题了.
例题:
2301
格点可视性问题
∑f(d)∑⌊N/d⌋d|nF(n)\sum f(d)\sum_{d|n}^{\lfloor N/d \rfloor}F(n)
这个就必修使用双分套分块求和以达到O(n)O(n)的复杂度了.
可以参考文献33.
例题:
能量采集
筛出每一个gcd(a,b)=d的个数 d=1,2,…,nd = 1,2,\dots ,n
这个题目不需要mobius也能解决,主要是筛法应用.
题目:
GCD of Sequence.
参考
从N往1,运用筛法O(nlgn)O(nlgn)
一个分块求和的例子
Mophues
这个题目就是用了分块求和,求出对于每一个计算⌊N/j⌋\lfloor N/j \rfloor的mobius贡献,再运用分块求和再n√\sqrt n处理询问.
参考文献:
贾智鹏 线性筛
ACDreamer
sengxian’s blog
莫比乌斯(mobius)笔记相关推荐
- 莫比乌斯函数_莫比乌斯环:python-matplotlib可视化实现
1 说明: ===== 1.1 莫比乌斯环:mobius strip,又叫莫比乌斯带. 1.2 公元1858年,德国数学家莫比乌斯(Mobius,1790~1868)和约翰·李斯丁发现. 图片来自网络 ...
- 莫比乌斯带catia建模_用sw2018制作莫比乌斯环图文教程
概述: 莫比乌斯环的概念来自于莫比乌斯带,公元1858年,德国数学家莫比乌斯(Mobius,1790-1868)和约翰·李斯丁发现:把一根纸条扭转180°后,两头再粘接起来做成的纸带圈,具有魔术般的性 ...
- 狄利克雷卷积_狄利克雷卷积学习笔记
蒟蒻我在莫比乌斯反演学习笔记里留下了几个坑,于是开始漫长的填坑路. 狄利克雷卷积学习笔记 前置知识1:数论函数 什么是数论函数呢?数论函数指定义域为正整数,陪域为复数的函数. 以下知识中涉及到的函数大 ...
- matlab 莫比乌斯曲面,神奇的莫比乌斯带,只有一个曲面可以无限循环
人们都说学无止境,知识是无穷无尽的,总是存在着许多新奇的知识是我们所不了解的.就像莫比乌斯带一样,竟然有着魔术般的神奇性质,能够折成一个曲面,如果放上一只小虫子的话,小虫子可以在上面无限循环的一直爬. ...
- 莫比乌斯函数---C++
[问题描述] 莫比乌斯函数,数论函数,由德国数学家和天文学家莫比乌斯(Mobius,1790-1868)提出.梅滕斯(Mertens)首先使用μ(n)作为莫比乌斯函数的记号.而据说,高斯(Gauss) ...
- 请叫我En-Tan-Mo
我叫En-Tan-Mo,很高兴认识你. 什么tanmo??? 我叫En-Tan-Mo,很高兴认识你. en什么mo??? 我叫En-Tan-Mo,很高兴认识你. entan什么?? emmmm 以上场 ...
- 「Note」Math not for OI
大家以我为戒 千万不要这么学 oi ( todolist 会越鸽越长的 高代那部分莫名其妙写了一大堆 其实我写完之后也没复习过几遍.. 而且千万不要抄看起来很厉害实际上也很厉害的东西抄爽了,, 更不要 ...
- 【算法笔记】莫比乌斯反演(包含定理,两种形式的证明及入门经典模板)
整理的算法模板合集: ACM模板 目录 一.莫比乌斯反演 二.几个概念和定理 三.两种形式的莫比乌斯反演证明 四.POJ 3904 Sky Code(入门例题) 一.莫比乌斯反演 学习笔记,我是看这个 ...
- 莫比乌斯反演专题学习笔记
莫比乌斯反演专题学习笔记 本文记录一些和莫反有关的内容的笔记 可能存在诸多谬误,阅读时请谨慎分析 若发现文中有谬误,如您愿意,恳请您向我指出,不胜感激! 为什么要学莫比乌斯反演? 解决一类与狄利克雷卷 ...
最新文章
- iOS--优秀博客记录
- 极大似然估计_计量经济学 | 极大似然估计
- 方舟服务器如何修改恐龙,方块方舟人物及驯养恐龙属性修改教程 人物属性怎么修改_游侠网...
- Asp中解决AJAX乱码问题
- linux下find查找带有指定权限的文件(windows下编译的源代码文件)
- ASP.NET MVC (一、控制器与视图)
- 利用snmptools实现cacti自定义监控Windows性能计数器
- jetty优秀文章转载
- 用python求两个人的平均身高_黄哥Python:分治算法(Divide-and-Conquer)
- Ubuntu执行脚本报错-bash: ./send.py: /usr/bin/python: bad interpreter: Permission denied
- uoj#267. 【清华集训2016】魔法小程序(乱搞)
- (day 52 - 先序后序遍历计数 ) 剑指 Offer 55 - II. 平衡二叉树
- 对 /etc/rc.d/init.d 目录的一点理解
- atitit.数据验证--db数据库数据验证约束
- matlab2016a安装
- 游戏计算机代码大全,DNF各类错误代码大全及解决方法
- 随机数生成器(RNG, random number generator)
- 查看本机mysql安装信息
- 电脑连接手机热点时,电脑能够搜到但是却连接不上的问题
- word读入富文本编辑器,编辑后导出下载word日常总结