莫比乌斯反演实际上是一两个公式定理的运用,自认为想要掌握它的话,其中的证明还是有必要了解的。看过网上一些博客,感觉都只证明了一半,没看到有人将这个定理完全证明出来。然而我最近在正好在学习初等数论,发现完全证明这个定理实际上并不需要很多知识,特此填坑。

实际上,这个定理的证明用到了一点数论函数相关知识。前置技能在此

https://blog.csdn.net/tomandjake_/article/details/81083051

内容并不多,自认为把这一页笔记内容学会,自己就可以把莫比乌斯反演的证明当练习题一样独立完成。接下来我还是会解释,当然,如果觉得我的解释不好,完全可以自己看这个笔记学习,我甚至都推荐自己看笔记,因为如果熟悉这样的数学语言,其实看的很快而且会有自己的认识。而且其中给出了欧拉函数的推导,没有学过欧拉函数的话,看这个也可以更加高效地学完这一块内容。(注意笔记中(m,n)=gcd(m,n) )

好,进入正题。首先引入三个定义

Definition 1 可乘函数:算术函数f,满足 只要gcd(m,n) =1,就有f(mn)=f(m)f(n)。

没错, 比其他可乘函数宽泛一点,只要在gcd(m,n)=1条件下满足可乘就行。然后我们知道由唯一分解定理,任何正整数n可分解为若干素数的幂方积,所以若为可乘函数,有

    ..................................................................(1)

Definition 2 : 代表对n的所有正因子求和,如

Definition 3 莫比乌斯函数:

定义有点奇怪,关于这个函数,之后我们可以看到它的作用, 必须提到的是,可以证明,莫比乌斯函数是可乘函数

然后是我们的目标----莫比乌斯反演定理:

Theorem 1 莫比乌斯反演定理: F(n)和f(n)为算术函数,若他们满足

则有

证明如下:

首先给出一个定理,

至于为可乘函数的证明,可参见我的笔记。

之后可以得到下一个定理

定理3证明:

可以看到,莫比乌斯反演提供了一个F(n)与f(n)的连接,而他们之间的桥梁就是莫比乌斯函数。之后我们会看到具体的例子。这里先给出线性筛莫比乌斯函数的代码:

int mu[maxn], vis[maxn];
int primes[maxn], cnt;
void get_mu() {memset(vis, 0, sizeof(vis));memset(mu, 0, sizeof(mu));cnt = 0; mu[1] = 1;for (int i = 2; i <= maxn; ++i) {if (!vis[i]) { primes[cnt++] = i; mu[i] = -1; }for (int j = 0; j<cnt&&primes[j] * i <= maxn; ++j) {vis[primes[j] * i] = 1;if (i%primes[j] == 0)break;mu[i*primes[j]] = -mu[i];}}
}

应用举例:POJ 3904

题目给出n和n个正整数,问能找出多少个不同的四元组(a,b,c,d)使得该四元组的最大公因数为1.

分析:

首先要提的是,我们做题目往往用的是莫比乌斯反演的另外一种形式:

既然要用到莫比乌斯反演,我们首先就要找到合适的F和f。实际上,F和f的关系在于整除。我们可以假设

F(n)为有多少个四元组满足gcd(a,b,c,d)=n的整数倍

f(n)为有多少个四元组满足gcd(a,b,c,d)=n

所以我们的目标就是求f(1), 而实际上可以看出F与f构成了一组莫比乌斯变换对。有了反演公式,我们可以通过求F来求f,而这里面F很好求,要求F(n)我们只要在原数组中数出到能被n整除的数的个数m, 则C(m,4)就是F(n)

而由公式,由此我们可以发现

直接计算即可。

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<stack>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<sstream>
#include<cmath>
#include<iterator>
#include<bitset>
#include<stdio.h>
using namespace std;
#define _for(i,a,b) for(int i=(a);i<(b);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
typedef long long LL;
const int INF = 1 << 30;
const int MOD = 1e9 + 7;
const int maxn = 10005;int n, a[maxn], tot[maxn];
int mu[maxn], vis[maxn];
int primes[maxn], cnt;
void get_mu() {memset(vis, 0, sizeof(vis));memset(mu, 0, sizeof(mu));cnt = 0; mu[1] = 1;for (int i = 2; i <= maxn; ++i) {if (!vis[i]) { primes[cnt++] = i; mu[i] = -1; }for (int j = 0; j<cnt&&primes[j] * i <= maxn; ++j) {vis[primes[j] * i] = 1;if (i%primes[j] == 0)break;mu[i*primes[j]] = -mu[i];}}
}void get_tot() {memset(tot, 0, sizeof(tot));for (int i = 0; i<n; ++i) {int x = a[i];int m = sqrt(x);for (int j = 1; j <= m; ++j) {if (x%j == 0)tot[j]++, tot[x / j]++;}if (m*m == x)tot[m]--;}
}
LL Cn4(int m) {if (m == 0)return 0;return 1ll * m*(m - 1)*(m - 2)*(m - 3) / 24;
}
int main()
{//freopen("C:\\Users\\admin\\Desktop\\in.txt", "r", stdin);//freopen("C:\\Users\\admin\\Desktop\\out.txt", "w", stdout);get_mu();while (~scanf("%d", &n)) {for (int i = 0; i<n; ++i) scanf("%d", &a[i]);get_tot();LL ans = 0;for (int i = 1; i<maxn; ++i) {ans += 1ll * mu[i] * Cn4(tot[i]);}printf("%I64d\n", ans);}return 0;
}

这样莫比乌斯反演就算是入门了吧。

莫比乌斯反演入门讲解相关推荐

  1. 莫比乌斯反演入门题目(详细)

    目录 luoguP2568 GCD hdu1695 GCD luogu3455[POI2007]ZAP-Queries luogu2522 [HAOI2011]Problem b P4318 完全平方 ...

  2. 莫比乌斯反演新手入门及练习题

    参考了以下大佬写出来的详细博客. 莫比乌斯反演入门讲解_tomandjake_的博客-CSDN博客_莫比乌斯反演 狄利克雷卷积与莫比乌斯函数_RBS的专栏-CSDN博客 在自己学习莫比乌斯反演时,自己 ...

  3. 【算法笔记】莫比乌斯反演(包含定理,两种形式的证明及入门经典模板)

    整理的算法模板合集: ACM模板 目录 一.莫比乌斯反演 二.几个概念和定理 三.两种形式的莫比乌斯反演证明 四.POJ 3904 Sky Code(入门例题) 一.莫比乌斯反演 学习笔记,我是看这个 ...

  4. matlab狄利克雷函数,数论入门1——莫比乌斯函数,欧拉函数,狄利克雷卷积,线性筛,莫比乌斯反演,杜教筛...

    数论入门1 一个菜鸡对数论的一点点理解... 莫比乌斯函数 定义函数$\mu(n)$为: 当n有平方因子时,$\mu(n)=0$. 当n没有平方因子时,$\mu(n)=(-1)^{\omega(n)} ...

  5. HYSBZ - 1101——莫比乌斯反演

    [题目描述] HYSBZ - 1101 [题目分析] 昨天测试出了一道差不多的题目,我只能想到暴力,各种优化,最后都是运行了好久TLE,最后才知道要用到莫比乌斯反演,就想着今天研究一下,得出的结论就是 ...

  6. 【BZOJ3529】数表,莫比乌斯反演+BIT

    传送门 思路: 复习一下莫比乌斯反演 好像是数论入门题,然后我做了近一天-- 式子是这么化没错 n≤mn≤m ∑i=1n∑j=1m[σ(gcd(i,j))≤a]σ(gcd(i,j)) \sum^n_{ ...

  7. 莫比乌斯反演小结 + 黑暗爆炸 2301

    1.前言 莫比乌斯反演课上听蒙了,后来重新捋了一遍思路,看了一下示例,就明白了,写篇学习笔记总结下 2.一些引理 引理1 (莫比乌斯定理) ∑d∣nμ(n)={1,n=10,n≠1\sum_{d|n} ...

  8. 欧拉函数+狄利克雷卷积+莫比乌斯函数+莫比乌斯反演+整除分块+杜教筛

    Powered by:NEFU AB-IN 文章目录 欧拉函数 狄利克雷卷积 莫比乌斯函数 莫比乌斯反演 P3455 [POI2007]ZAP-Queries 整除分块 P2522 [HAOI2011 ...

  9. 离散数学/组合数学:序列与其对应的生成函数;多项式函数的系数与序列的联系;重复组合数的理解方法即----全1序列对应的生成函数做n重卷积(不严谨说法)之后得到的序列的x的k次方项的系数;莫比乌斯反演。

    继我所写的文章 "迭代.递归.栈.差分方程之间的本质联系以及由推广的迭代法解决"变态青蛙跳台阶"问题" 结束之后,自然的引出一个问题,就是关于如果真的给定k项之 ...

最新文章

  1. 今天看到两个题 写出来思考一下
  2. [CareerCup] 8.5 Online Book Reader System 在线读书系统
  3. linux deploy ENV 目录,手机安装linux deploy 安装和配置
  4. cookie完全跨域
  5. 计算机窗口设置不合并,电脑下边的任务栏不合并怎么办
  6. Windows使用筛选器来处理异常
  7. 3.5 将 Batch Norm 拟合进神经网络
  8. React 高级应用 -- 错误边界 Error Boundaries
  9. 小程序坑 redirectTo 计时器 setInterval clearInterval
  10. ubuntu python subprocess模块执行python脚本
  11. 如何输入多组字符串c语言,求教大侠:如何输入一组字符串
  12. 单片机十字路口c语言程序,单片机十字路口交通灯控制 C 程序
  13. c语言小球碰壁,小球碰壁效果
  14. python股票量化交易(10)---使用机器学习算法预测股票涨跌
  15. VS绿豆沙屏幕保护色参数设置
  16. 《HelloGitHub》第 74 期
  17. 开关电源:效率与VOUT的关系
  18. 定时器中断实验和PWM输出实验(寄存器)
  19. AFNetworking 之加载网络图片
  20. 【题】【矩阵】NKOJ 1901 喜欢奇数的面包师

热门文章

  1. Nagios配置飞信报
  2. 四条查看MySql版本号的命令
  3. POJ-2484 A Funny Game (坑爹的博弈论)
  4. r语言remarkdown展示图_R语言knitr之rmarkdown
  5. 基于图论的色谱指纹图谱谱峰的全局匹配
  6. 开源SNS社区系统推荐
  7. php安装oci8,php5安装oci8
  8. 开启win7 Aero效果
  9. 查询 AD 帐户密码到期的用户
  10. WebRTC Native M96 SDK接口封装--muteLocalAudioStream开关本地音频发送