退役之前写的 然后因为退役就咕咕咕了...
后来发现数学考试能用的到个鬼就发布出来了QwQ
主要是方便自己没登录的时候查阅...
显然子集什么的是没有学会的QwQ
所以学OI的话不要看本文!!!!!>


以下是懒得修改和编辑的原文:

基本引用自vfleaking大大的幻灯片...
我知道我写的没人看你萌只想要个链接而已~
本文注释~ 为了不影响阅读就添加一个跳转咯~


什么是反演:

假设有两个函数\(f\)和\(g\)满足
\[
f(n)=\sum_ka_{n,k}g(k)
\]
已知\(g\)求\(f\)当然很水啦,而已知\(f\)求\(g\)的过程就称为反演。
在一般情况下,直接裸上求反演只能高斯消元解方程爽爽……
利用一些特别的反演,可以给解题提供思路。
即,可以用未知量表示已知量,然后解出来。

反演(Inversion)的过程就像变一场炫酷(Xuanku(?))的魔术(Magic)一样, 所以我们就有了TXIM(The Xuanku Inversion Magic)这种东西 显然是在一本正经的胡说八道←_←


我们考虑一个简单问题:

说从前有\(n\)个人,编号为\(1,…,n\)。
这\(n\)个人站成一排,编号为\(i\)的人不能站在第\(i\)个。
求方案数。
\(n \leqslant 10^5\)

啊 我会容斥! 小学生的容斥就不说了qwq, 我们说一下中学生的容斥.
我们假如\(n\)个人都在随便站, 那么情况显然一共有\(n!\)种;
如果有至少1个人站对, 我们有\(n\)种方法选出这个站对的人, 剩下人有\((n-1)!\)种站法, 一共有\(n*(n-1)!\)种.
如果有至少2个人站对, 我们有\(\binom n2\)种选法选出站对的人, 剩下人有\((n-2)!\)种站法, 一共有\(\binom n2*(n-2)!\)种.
...
如果有至少k个人站对, 我们有\(\binom nk\)种方法选出站对的人, 剩下人有\((n-k)!\)种站法, 一共有\(\binom nk*(n-k)!\)种.

根据容斥, 令\(F(k)\)表示要求至少有\(k\)个人站对的情况总数, 即\(F(k)=\binom nk*(n-k)!\), 我们有
\[
ans=F(0)-F(1)+F(2)-F(3)+...+(-1)^n*F(n)=\sum_{k=0}^n(-1)^kF(k)=\sum_{k=0}^n(-1)^k\binom ni(n-k)!
\]
这样就搞定了~ 那么这个容斥系数\(\pm1\)是怎么来的呢?
我们发现, 至少\(m\)个人站对的话, 一定有\(0,1,2,3...m-1\)个人站对了, 那我们在之前的过程中重复统计了多少次呢?
我们有\(\binom mk\)次统计至少\(k\)个人站对的情况, 所以一共多统计了
\[
\sum_{k=0}^{m-1}(-1)^k\binom mk
\]
这么多次, 我们只需要减回去就行了~ 那这玩意怎么推啊?
我们可以知道有这么个东西: (牛顿)二项式定理:
\[
(x+y)^k=\sum_{i=0}^n\binom nix^iy^{n-i}
\]
所以
\[\sum_{k=0}^{m-1}(-1)^k\binom mk=\sum_{k=0}^m(-1)^k\binom mk-(-1)^m\binom mm=(1+(-1))^m-(-1)^m=(-1)^m\]
即对于每个\(m\), \(F(m)\)被多统计了\(-(-1)^m\)次, 减掉就行了~

是不是很简单? 主要就是利用了
\[
\sum_{k=0}^n(-1)^k\binom nk=0
\]
这个性质, 不过嘛, 有个小例外, 就是当\(n=0\)时, 值应该为1. 所以我们要改一改:
\[
\sum_{k=0}^n(-1)^k\binom nk=[n=0]
\]

这个问题我们就这么解决了. 先别急着撒花, 我们从另一个角度思考一下这个问题.
令\(f(x)\)表示\(x\)个人随便站的方案数, \(g(x)\)表示\(x\)个人都站错的方案数. 显然
\[
f(n)=\sum_{k=0}^ng(k)
\]
我们如果知道了\(g\)的表达式, 就可以推出\(f\)了.
可是, 我们现在知道的明明是\(f\), 我们要求的红红才是\(g\).
那能不能想办法用\(f\)来表示\(g\)呢? 我们不妨大胆的猜测是可以的.

有一句看上去是废话的话:
\[
g(n)=\sum_{m=0}^n[n-m=0]\binom nmg(m)
\]
然后我们发现有个\([n-m=0]\), 那就把刚才非常炫酷的性质
\[
\sum_{k=0}^n(-1)^k\binom nk=[n=0]
\]
代进去好了~
\[
=\sum_{m=0}^n\sum_{k=0}^{n-m}(-1)^k\binom {n-m}k\binom nmg(m)
\]
然后\(\binom {n-m}k\binom nm\)表示了从\(n\)中选两个长度分别为\(m\)和\(k\)的子集, 所以和\(\binom nk\binom {n-k}m\)等价, 那我们调整(jiao)一下柿纸里可爱的求和符号~
\[
=\sum_{k=0}(-1)^k\binom nk\sum_{m=0}^{n-k}\binom{n-k}mg(m)
\]
好的我们看到最后的小朋友\(\sum_{m=0}^{n-k}\binom{n-k}mg(m)\)有那么一点眼熟~ 你好啊, \(f\)君~
\[
g(n)=\sum_{k=0}(-1)^k\binom nkf(n-k)
\]
而且很显然, \(f(n-k)\)在我们的假设下就是\((n-k)!\), 所以和我们上面计算的结果是一个样的~

然后我们把上面的柿子换一下下标, 让它在数学的角度看更好看一点...从我的角度并看不出它好看在哪qwq
这样我们就推出了大名鼎鼎的二项式反演!!
\[
f(n)=\sum_{k=0}^n\binom nkg(k) \\
g(n)=\sum_{k=0}^n(-1)^{n-k}\binom nkf(k)
\]


我们考虑另一个小问题:

求长度为\(n\)且仅包含小写英文字母且循环节长度恰为\(n\)的字符串的个数。
循环节……就是最短的复制若干遍后拼起来跟原串相等的字符串。
\(n\leqslant10^9\)

我们设\(f(x)\)为长度为\(x\)的字符串的总数, \(g(x)\)为长度为\(x\)而且周期为\(x\)的字符串(其实就是没有长度小于\(x\)的循环节啦~)的总数. 那么很显然
\[
f(n)=\sum_{d|n}g(d)
\]
woc这不是莫比乌斯反演么= = 水过了下一个..
我们假设忘记了莫比乌斯反演. 现在我们只知道我们需要一个反演.
我们假设有个函数\(\mu\), 有如下的性质.
\[
\sum_{d|n}\mu(d)=[n=1]
\]
你为什么那么熟练啊!
然后我们按照套路找到一句废话并将上面的结论代入
\[
g(n)=\sum_{m|n}[\frac nm=1]g(m)=\sum_{m|n}\sum_{d|\frac nm}\mu(d)g(m)
\]
套路来了, 因为\(d|\frac nm\), 所以\(md|n\), 所以\(m|\frac nd\)! 我们还是调整(jiao)一下柿纸里的求和符号~
\[
g(n)=\sum_{d|n}\mu(d)\sum_{m|\frac nd}g(m)
\]
哟, 这不是\(f\)冒出来了么~
\[
g(n)=\sum_{d|n}\mu(d)f(\frac nd)
\]
我们冥冥之中感觉这个柿纸里的\(\mu\)是传说中的莫比乌斯函数~

然后就完了. 这其实就是莫比乌斯反演.
或许还可以换一下下标
\[
f(n)=\sum_{d|n}g(d) \\
g(n)=\sum_{d|n}\mu(\frac nd)f(d)
\]

另外狄利克雷卷积角度的解释由于和本文无关但是我就是想提一下所以扔到了里~

莫比乌斯反演


注:

  1. 本文的\(\binom nm\)均表示组合数, 即\(C_n^m\), 就系表达式为\(C_n^m=\frac {n!}{m!(n-m)!}\)的那个.
  2. \([x]\)(\(x\)为表达式)表示当\(x\)成立时为1, 否则为0.
  3. 另外狄利克雷卷积形式的理解就是:
    \[
    f(n)=\sum_{d|n}g(d) =>f=g*1 \\
    f*\mu=(g*1)*\mu=g*(1*\mu)=g*\epsilon=g \\
    g=f*\mu => g(n)=\sum_{d|n}f(d)\mu(\frac nd)
    \]

【学术篇】The Xuanku Inversion Magic学习笔记的更多相关文章

  1. 第三篇 功能实现(3) (Android学习笔记)

    第三篇 功能实现(3) ●发一个广播和启动一个隐式的Intent非常像,那么它们之间有什么区别呢? Implicit Intents (sent via startActivity( )) and B ...

  2. 第三篇 功能实现(2) (Android学习笔记)

    第三篇 功能实现(2) ●Activity的四种启动模式 Activity的启动模式有四种,分别是standard.singleTop.singleTask和singleInstance. 在Andr ...

  3. 第三篇 功能实现(1) (Android学习笔记)

    第三篇 功能实现(1) 第8章 Android应用程序组成 ●Android的一些中.底层基础知识 ※ Android Framework 启动过程 Android手机系统本质上是一个基于Linux的 ...

  4. 我的第一篇博客:requestAnimationFrame学习笔记

    通常,我们在浏览器中写动画会用到哪些技术呢? flash 可以实现一些非常复杂的动画,但随着HTML5的成熟,个人感觉flash终究会成为明日黄花. css3 当前大部分现代浏览器已经对css3支持的 ...

  5. Git-第五篇廖雪峰Git教程学习笔记(4)分支

    1.一开始,只有一个主分支(master),HEAD指向Master,而Master指向主分支.现在我们创建dev分支. lfy@lfy-PC MINGW64 /c/fyliu/lfyTemp/git ...

  6. Git-第四篇廖雪峰Git教程学习笔记(3)远程仓库,克隆远端库

    1.本次连接的是gitHub仓库. 1>创建SSH Key. ssh-keygen -t rsa -C "youremail@example.com" lfy@lfy-PC ...

  7. Git-第三篇廖雪峰Git教程学习笔记(2)回退修改,恢复文件

    1.工作区 C:\fyliu\lfyTemp\gitLocalRepository\yangjie 2.版本库 我们使用git init命令创建的.git就是我们的版本库.Git的版本库里存了很多东西 ...

  8. Git-第二篇廖雪峰Git教程学习笔记(1)基本命令,版本回退

    1.安装Git-2.16.2-64-bit.exe后,设置用户名,用户邮箱 #--global参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地 ...

  9. 这篇SpringBoot整合JSON的学习笔记,建议收藏起来,写的太细了

    前言 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛. 采用完全独立于编程语言的文本格式来存储和表示数据. 简洁和清晰 ...

随机推荐

  1. elasticsearch 父子关系

    ElasticSearch 中的Parent-Child关系和nested模型是相似的, 两个都可以用于复杂的数据结构中,区别是 nested 类型的文档是把所有的实体聚合到一个文档中而Parent- ...

  2. Android中Parcelable的原理和使用方法

    Parcelable的简单介绍 介绍Parcelable不得不先提一下Serializable接口,Serializable是Java为我们提供的一个标准化的序列化接口,那什么是序列化呢? 进行And ...

  3. 将循环结果通过管道 传递给其他命令处理(done |)

  4. Linux历史命令管理以及用法

    history [-c] [-d offset] [n] history -anrw [filename] history -ps arg [arg...] -c: 清空命令历史 -d offset: ...

  5. 一次CTS引发的网络故障

    接到业务部门通知,A机房(库a)到B机房(库b)之间的数据库服务器之间的网络带宽异常突增,影响公司对外业务的整体带宽.一接到通知,作为数据库管理对所涉及的IP还是比较敏感.第一反应就是可能当时主库产生 ...

  6. 【串线篇】SpringMVC运行流程

    1.所有请求,前端控制器(DispatcherServlet)收到请求,调用doDispatch进行处理 2.根据HandlerMapping中保存的请求映射信息找到,处理当前请求的,处理器执行链(包 ...

  7. python print 连续输出变量加字符串

    a=1 b=2 print(a,'+',b,'=',a+b) 输出:1+2=3

  8. MyBatis注解开发-@Insert和@InsertProvider(@Select、@SelectProvider雷同)

    @Insert和@InsertProvider都是用来在实体类的Mapper类里注解保存方法的SQL语句.不同的是,@Insert是直接配置SQL语句,而@InsertProvider则是通过SQL工 ...

  9. gene network analysis

      基因表达分析包括3个层次[68], 首先是单基因水平, 即比较对照组与实验组的每个基因是否存在表达差异, 这主要指差异基因表达分析; 其次是多基因水平, 如按照基因的共同功能.相互作用.共同表达等 ...

  10. PHP filter_id() 函数

    定义和用法 filter_id() 函数返回指定过滤器的 ID 号. 如果成功则返回过滤器的 ID 号,如果过滤器不存在则返回 NULL. 语法 filter_id(filter_name) 参数 描 ...