【学术篇】The Xuanku Inversion Magic学习笔记
退役之前写的 然后因为退役就咕咕咕了...
后来发现数学考试能用的到个鬼就发布出来了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)
\]
另外狄利克雷卷积角度的解释由于和本文无关但是我就是想提一下所以扔到了注里~
莫比乌斯反演
注:
- 本文的\(\binom nm\)均表示组合数, 即\(C_n^m\), 就系表达式为\(C_n^m=\frac {n!}{m!(n-m)!}\)的那个.
- \([x]\)(\(x\)为表达式)表示当\(x\)成立时为1, 否则为0.
- 另外狄利克雷卷积形式的理解就是:
\[
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学习笔记的更多相关文章
- 第三篇 功能实现(3) (Android学习笔记)
第三篇 功能实现(3) ●发一个广播和启动一个隐式的Intent非常像,那么它们之间有什么区别呢? Implicit Intents (sent via startActivity( )) and B ...
- 第三篇 功能实现(2) (Android学习笔记)
第三篇 功能实现(2) ●Activity的四种启动模式 Activity的启动模式有四种,分别是standard.singleTop.singleTask和singleInstance. 在Andr ...
- 第三篇 功能实现(1) (Android学习笔记)
第三篇 功能实现(1) 第8章 Android应用程序组成 ●Android的一些中.底层基础知识 ※ Android Framework 启动过程 Android手机系统本质上是一个基于Linux的 ...
- 我的第一篇博客:requestAnimationFrame学习笔记
通常,我们在浏览器中写动画会用到哪些技术呢? flash 可以实现一些非常复杂的动画,但随着HTML5的成熟,个人感觉flash终究会成为明日黄花. css3 当前大部分现代浏览器已经对css3支持的 ...
- Git-第五篇廖雪峰Git教程学习笔记(4)分支
1.一开始,只有一个主分支(master),HEAD指向Master,而Master指向主分支.现在我们创建dev分支. lfy@lfy-PC MINGW64 /c/fyliu/lfyTemp/git ...
- Git-第四篇廖雪峰Git教程学习笔记(3)远程仓库,克隆远端库
1.本次连接的是gitHub仓库. 1>创建SSH Key. ssh-keygen -t rsa -C "youremail@example.com" lfy@lfy-PC ...
- Git-第三篇廖雪峰Git教程学习笔记(2)回退修改,恢复文件
1.工作区 C:\fyliu\lfyTemp\gitLocalRepository\yangjie 2.版本库 我们使用git init命令创建的.git就是我们的版本库.Git的版本库里存了很多东西 ...
- Git-第二篇廖雪峰Git教程学习笔记(1)基本命令,版本回退
1.安装Git-2.16.2-64-bit.exe后,设置用户名,用户邮箱 #--global参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地 ...
- 这篇SpringBoot整合JSON的学习笔记,建议收藏起来,写的太细了
前言 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛. 采用完全独立于编程语言的文本格式来存储和表示数据. 简洁和清晰 ...
随机推荐
- 关于GeneXus封装方法Model的方法
最近 刚从外地出差回来 工作任务不是很重 能够抽点时间记点东西 下午花了2个多钟头尝试了一下GeneXus的封装方法的功能,这里记一下便于自己以后查看.我们在许多项目中或多或少都会有着重复代码编写的 ...
- 工作中SQL语句的优化
在我们的工作中,数据是很多的,这是我常见问题遇到的问题做了简短总结. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 w ...
- CentOS 6.5安装aria2(转载)
CentOS 6.5安装aria2 由于yum install aria2无法找到安装包,试了好几个源,都找不到,于是自己找了一些地址: 1.下载安装包: # wget http://ftp.tu-c ...
- shell input value from console
echo "Please enter some input: " read input_variable echo "You entered: $input_variab ...
- AtCoder Beginner Contest 130 F Minimum Bounding Box 三分法求极值(WA)
题意:给n个点的起始坐标以及他们的行走方向,每一单位时间每个点往它的方向移动一单位.问最小能包围所有点的矩形. 解法:看到题目求极值,想了想好像可以用三分法求极值,虽然我也不能证明面积是个单峰函数. ...
- Java 代码规范,你应该知道的一些工具和用法(转)
转自:http://yifeng.studio/2017/06/30/coding-with-code-style/ Java 代码规范,你应该知道的一些工具和用法 2017-06-30 从事编程这个 ...
- easyUi-datagrid 真分页 + 工具栏添加控件
1. 新建Pager.js /** * * @param {any} el 元素 */ function showDataGrid1(el) { $(el).datagrid({ title: '分 ...
- eclipse开发安卓 发短信打电话发送邮件功能
1.在mainfiest中添加 //添加拨打电话的功能 <uses-permission android:name="android.permission.CALL_PHON ...
- LR之-参数化
1.改变参数化主要在于select next now和update value on这个二个选项 sequential:顺序取值 random:随机取值 unique:唯一取值 same line a ...
- 【Spring Boot】Spring Boot项目设置多个配置文件,并在生产环境中的Tomcat设置对应的配置文件
1.修改Spring Boot项目配置文件 除了主配置文件,另外创建2个配置文件,注意命名要用application-*.properties 主配置文件中写入,使用dev作为开发配置 spring. ...