首页 > 其他分享 >学习笔记:反転魔法

学习笔记:反転魔法

时间:2023-08-12 20:23:04浏览次数:38  
标签:limits sum 魔法 笔记 times 学习 反演 eqnarray choose

学习笔记:反転魔法

1. 反演是什么?

反演这个词,意思是两个函数(当然也可以是数列一类的东西)的 双向求和 关系。

比如已知 \(f(i)=\sum \limits_{j=0}^{+\infty} A(i,j) \times g(j)\),然后推出 \(g(i)=\sum \limits_{j=0}^{+\infty}B(i,j) \times f(j)\),这就是一对反演关系。

那么反演成立需要一定的条件,可以直接带入式子看一看:

\[\begin{eqnarray} f(i) &=&\sum \limits_{j=0}^{+\infty}{A(i,j)\times {\sum\limits_{k=0}^{+\infty}B(j,k) \times f(k)}} \\ &=&\sum \limits_{j=0}^{+\infty}{\sum\limits_{k=0}^{+\infty}A(i,j)\times B(j,k) \times f(k)} \\ &=&\sum \limits_{k=0}^{+\infty}{f(k) \times \sum\limits_{j=0}^{+\infty} A(i,j)\times B(j,k)} \\ \end{eqnarray} \]

显然,反演成立,当且仅当 \(\sum \limits _{j=0}^{+\infty} A(i,j) \times B(j,k)=[i=k]\)。

另一种看法是:把 \(A\) 和 \(B\) 看作两个系数矩阵,那么反演成立当且仅当这两个矩阵互逆。

这种看法有一些好处,因为可以用上矩阵的性质,如:

  • 两个互逆矩阵的转置依然互逆,\(({A}^\top)^{-1}=(A^{-1})^\top\)。
  • 两个可逆矩阵的乘积依然可逆,且为这两个矩阵的逆的乘积,\((AB)^{-1}=A^{-1}B^{-1}\)。

当然直接在式子上看也是对的,不过矩阵更直观。

有了反演,我们就能把一个不是很好求的式子 \(f\),转化成求另一个较好求又与 \(f\) 有反演关系的式子 \(g\),再反演推回 \(f\)。

这么说有点抽象,不过确实是这个样子。

这里列一下反演的一点性质,有些时候可以方便推式子。

  1. \[\sum \limits _{j=0}^{+\infty} {-1}^{i-j} \times A(i,j) \times B(j,k)=[i=k] \iff \sum \limits _{j=0}^{+\infty} {-1}^{j+k} \times A(i,j) \times B(j,k)=[i=k] \]

    这个可以把两边同时乘上 \({-1}^{k-i}\) 得到,注意 \({-1}^{-j}={-1}^j\)。

    这个在一些题里面,可以凑 \(-1\) 的系数。

    当然其他类似的操作也是可以的,只要两边依然等价。

  2. \[f(x_1,x_2,\cdots,x_n)=\sum \limits_{i_1=0}^{+\infty}\sum \limits_{i_2=0}^{+\infty}\cdots\sum \limits_{i_n=0}^{+\infty} \prod \limits_{p=1}^{n}A_p(x_p,i_p)\times g(i_1,i_2,\cdots,i_n) \iff g(x_1,x_2,\cdots,x_n)=\sum \limits_{i_1=0}^{+\infty}\sum \limits_{i_2=0}^{+\infty}\cdots\sum \limits_{i_n=0}^{+\infty} \prod \limits_{p=1}^{n}B_p(x_p,i_p)\times f(i_1,i_2,\cdots,i_n) \]

    这个是高维反演,意思就是 总的系数等于每一维系数的积

    证明不会,可以感性,或者是唠嗑一下这样形式的系数对应矩阵依然互逆。

2. 入门:二项式反演

属于是最基础的一类,基于二项式定理。

基本形式:

\[f(i)=\sum\limits_{j=0}^{i}{-1}^j {i \choose j} g(j) \iff g(i)=\sum \limits_{j=0}^{i}{-1}^j{i \choose j} g(j) \]

长得出奇地对称。

这里 \(A(i,j)=B(i,j)={-1}^j \times {i \choose j}\)。

考虑证明:

\[\begin{eqnarray} A(i,j)\times B(j,k)&=& -1^i {i\choose j} \times -1^k {j\choose k} \\ &=& -1^{i+k}{i \choose j} {j \choose k} \end{eqnarray} \]

不是很好做,因为两个组合数有关系。

不过我们可以把组合数拆开,使用这个公式:

\[\begin{eqnarray} {n\choose m}\times{m\choose r}&=& \frac{n! \times m!}{m! \times (n-m)! \times r! \times (m-r)!} \\ &=& \frac{n!}{(n-m)! \times r! \times (m-r)!} \\ &=& \frac{n!}{r! \times (n-r)!} \times \frac{(n-r)!}{(n-m)! \times (m-r)!} \\ &=& {n\choose r} {n-r \choose n-m} \end{eqnarray} \]

这样 \(j\) 就可以被提出来,这次我们加上外面的和式(注意 \(j<k\) 时系数直接为 \(0\),所以从 \(k\) 开始):

\[\begin{eqnarray} \sum\limits_{j=k}^{n} A(i,j)\times B(j,k)&=& \sum\limits_{j=k}^{n} -1^{i+k}{i \choose j} {j \choose k} \\ &=& \sum\limits_{j=k}^{n} -1^{i+k}{i\choose k}{i-k\choose i-j} \\ &=& -1^k{i\choose k} \sum\limits_{j=k}^{n} -1^i{i-k\choose i-j} \end{eqnarray} \]

似乎还是不可做,但不要忘记我们这是二项式反演,我们可以往二项式定理上面靠:

\[\begin{eqnarray} \sum\limits_{j=k}^{n} A(i,j)\times B(j,k)&=& -1^k{i\choose k} \sum\limits_{j=0}^{i-k} -1^{i-j}{i-k\choose i} \end{eqnarray} \]

这里是 把 \(j\) 从 \(k\) 对称到 \(0\),现在就是二项式定理的样子了,展开则有:

\[\begin{eqnarray} \sum\limits_{j=k}^{n} A(i,j)\times B(j,k)&=& -1^{i+k}{i\choose k}(1-1)^{i-k} \end{eqnarray} \]

虽然很怪异,但是 \(0^0\) 在我们的计算中,它被认为是等于 \(1\) 的。

由上我们就得到了二项式反演的基本形式……

二项式反演的不同形式:

  • \[f(i)=\sum\limits_{j=0}^{i}{i\choose j}g(j) \iff g(i)=\sum\limits_{j=0}^{i}-1^{i-j}{i\choose j}g(j) \]

    原理其实是凑 \(-1\) 的系数。

  • \[f(i)=\sum\limits_{j=i}^{n}{j\choose i}g(j) \iff g(i)=\sum\limits_{j=i}^{n}-1^{j-i}{j\choose i}g(j) \]

    这个可以看上一个式子,然后系数做矩阵的转置。

  • \[f(i)=\sum\limits_{j=i}^{n}{-1}^{j}{j\choose i}g(j) \iff g(i)=\sum\limits_{j=i}^{n}-1^{j}{j\choose i}g(j) \]

    把 \(-1\) 的系数捞回来,就又多了一种。

至此,二项式反演的基础就完备了。(大概……

让我们来看一道题目吧!

CF997C Sky Full of Stars

Problem:

  • 有一个 \(n \times n\) 的正方形网格,用三种颜色染色,求有多少种染色方案使得至少一行或一列是同一种颜色。

  • \(1 \le n \le 10^6\),结果对 \(998244353\) 取模。

Idea:

看见”至少“,考虑容斥。

感性认为方案数和二项式有关,而又有行列两种限制,大力高维二项式反演。

  • \(f(i,j)\) 为钦定有 \(i\) 行 \(j\) 列是同一种颜色的方案数。
  • \(g(i,j)\) 为恰好有 \(i\) 行 \(j\) 列是同一种颜色方案数。

钦定指只在意有我们选出这部分满足,其余不在意的情况。

此时的答案为:\(all-g(0,0)\)。

直接算 \(g\) 是 hard 的,而 \(f\) 算 \(g\) 的系数不明显,但是知道 \(g\) 却能很方便地算 \(f\)。

那么直接用 \(g\) 算 \(f\),并据此得到 \(f\) 算 \(g\) 的系数:

\[f(i,j)=\sum\limits_{x=i}^{n}\sum\limits_{y=j}^{n}{x\choose i}{y\choose j}g(x,y) \iff g(i,j)=\sum\limits_{x=i}^{n}\sum\limits_{y=j}^{n}{-1}^{x+y-i-j}{x\choose i}{y\choose j}f(x,y) \]

接下来就是计算右边这一坨的问题,分两步:

1. 算 \(f(i,j)\)

分类讨论一下:

  1. \(i \ne 0,j\ne 0\):\(f(i,j)=3\times {n\choose i}{n\choose j} \times 3^{(n-i)(n-j)}\),即选出这部分,且均为某种颜色,其余部分任选。
  2. \(i \ne 0,j=0\):\(f(i,0)=3\times{n\choose i}\times3^{n(n-i)}\),这不用要求行和列的颜色相同,所有略有变化。
  3. \(i=0,j\ne 0\):\(f(0,j)=3\times{n\choose j}\times 3^{n(n-j)}\),同上。
  4. \(i=0,j=0\):\(f(0,0)=3^{n^2}\),最简单的一种。

发现都很好算,简单 \(\mathcal{O}(n)\) 预处理即可。

2. 算系数

这是重难点,直接暴力 \(\mathcal{O}(n^2)\) T 飞。

所以拆式子!

为了方便,这里把 \(i \ne 0,j \ne 0\) 的情况先带入:

\[\begin{eqnarray} g(0,0)&=& \sum\limits_{x=1}^{n}\sum\limits_{y=1}^{n}{-1}^{x+y-i-j}{x\choose 0}{y\choose 0}f(x,y) \\ &=& \sum\limits_{x=1}^{n}\sum\limits_{y=1}^{n}{-1}^{x+y}\times 3\times{n\choose x}{n\choose y}\times 3^{(n-x)(n-y)} \\ &=& 3^{n^2+1}\sum\limits_{x=1}^{n}\sum\limits_{y=1}^{n}{-1}^{x+y}{n\choose x}{n\choose y}\times 3^{-(x+y)n+xy} \\ &=& 3^{n^2+1}\sum\limits_{x=1}^{n}-1^x{n\choose x}\times 3^{-xn}\sum\limits_{y=1}^{n}{-1}^y{n\choose y}\times 3^{-yn+xy} \end{eqnarray} \]

现在变乱了一点,不过还是很简单,然而 \(3^{xy}\) 次方拆不掉……

不要慌张,我们只求 \(g(0,0)\),可以试着通过二项式定理(长得像)干掉内层循环。

\[\begin{eqnarray} \sum\limits_{y=1}^{n}{-1}^y{n\choose y}\times 3^{-yn+xy} &=& \sum\limits_{y=0}^{n}{-1}^y{n\choose y}\times 3^{y(x-n)}-1 \\ &=& \sum\limits_{y=0}^{n}{1}^{n-y}{n\choose y}\times {-3}^{y(x-n)}-1 \\ &=& (1-3^{x-n})^n-1 \end{eqnarray} \]

这个好了,我们再带入 \(i \ne 0,j = 0\) 的情况(其实也能直接算,不过拆下式子练练手),另一种同理(其实本质相同,因此值也相等):

\[\begin{eqnarray} g(0,0)&=& \sum\limits_{x=1}^n -1^x{x\choose 0}f(x,y) \\ &=& \sum\limits_{x=1}^n -1^x \times 3\times{n\choose x}\times 3^{n(n-i)} \\ &=& 3^{n^2}\sum\limits_{x=1}^n -1^x \times 3^{x-nx}{n\choose x} \\ &=& 3^{n^2}\sum\limits_{x=1}^n 1^{n-x} \times {-3}^{x(1-n)}{n\choose x} \\ &=& 3^{n^2}((1-3^{1-n})^n-1) \\ \end{eqnarray} \]

最后的直接算即可,复杂度 \(\mathcal{O}(n\log_2 n)\)。

一点总结:

二项式反演之所以称为二项式反演,其不仅为系数为二项式系数,在推导式子的时候,也常常会用到二项式定理,即 \(\sum\limits_{i=0}^{n}a^ib^{n-i}{n\choose i}=(a+b)^n\)。

有时候二项式系数是 \(\sum\limits_{i=k}^{n}{i\choose k}\) 的形式的时候,可以把下标平移到 \(0 \sim n-k\),得到形如 \(\sum\limits_{i=0}^{n-k}{i+k\choose k}\) 的式子,会变得较为方便。

又或者有时你发现系数长成 \(\sum\limits_{i=0}^{n}{-1}^i x^i{n\choose i}\) 的样子,不能直接上二项式定理,但如果左边是 \(1^i\) 就显然可以,那不妨把负号拿给 \(x\),变成 \({(-x)}^i\),这样就能套上了。

其实这点小技巧跟反演本身没什么关系,主要是推式子的能力。

我不说是哪个拉只因 qL 以前题解贺惯了,现在跑回来补这些。

标签:limits,sum,魔法,笔记,times,学习,反演,eqnarray,choose
From: https://www.cnblogs.com/LQ636721/p/17625397.html

相关文章

  • 《深入理解Java虚拟机》读书笔记:垃圾收集器
    垃圾收集器 HotSpot虚拟机包含的所有收集器如图3-5所示。图3-5展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。新生代收集器:Serial、ParNew、ParallelScavenge,新生代收集器均采用复制算法老年代收集器:SerialOld(标记-整理算法)、Paral......
  • 笔记工具
    这两周从听#纵横四海播客#刻意练习和笔记的力量开始逐渐关注到双链笔记,其实最早在听ByteTalk的时候就有听到一期嘉宾介绍到一款双链笔记#logseq.其实给我印象最深的是刻意练习中关于对学习的讲解,其中提到刻意练习最重要的几部分:chunk和link.而双链笔记最主要的......
  • php字符串学习
    addcslashes:以某个字母为界限,增加斜杠echoaddcslashes('xiaomingming','m');输出:xiao/ming/mingbin2hex:将字符串对应的ASCII的十进制值转化为对应的十六进制如:a对应97,输出61echobin2hex(a);输出:61chop:rtrim的别名,移除字符串右端的空白echochop('Shangh......
  • 国产MCU-CW32F030开发学习- 移植rtthread-nano
    国产MCU-CW32F030开发学习--移植rtthread-nano硬件平台CW32_48F大学计划板CW32_IOT_EVA物联网开发评估套件RT-ThreadNanoRT-ThreadNano是一个极简版的硬实时内核,它是由C语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的RTOS。其内存资源......
  • RT-Thead学习-GD32移植(基于RT-Thread Nano源码)
    1前言当前关于RT的移植教程有很多,纯复制大佬们的很迷糊,参考官方手册和一些经验贴,完成了基于Nano源码的移植,最简单的移植教程就是基于keil的和这一种。参考资料1.野火资料(https://doc.embedfire.com/rtos/rtthread/zh/latest/application/porting_to_stm32.html)2.微信公众号(物联网......
  • Vue学习笔记:路由开发 Part 08 导航守卫
    vue-router提供的导航守卫主要用来通过跳转或取消的方式守卫导航。这里有很多方式植入路由导航中:全局的,单个路由独享的,或者组件级的。全局前置守卫可以使用 router.beforeEach 注册一个全局前置守卫。当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航......
  • C语言学习笔记(十)文件操作
    十、文件操作程序文件数据文件本章学习的是数据文件文件名包含三部分:文件路径+文件名主干+文件后缀c:\code\test.php文件类型文本文件:肉眼就能看懂二进制文件:数据在内存中以二进制的形式存储,若不加转换就输出到外存,就是二进制文件字符一律以ASCII码形式存......
  • Flowable学习记录(持续更新中)
    最近在研究flowable,记录一下学的东西表结构的一些知识flowable数据库表结构三、Flowable基础表结构参考材料:flowable用户手册......
  • C++通用学习速成判定
    C++的继承【C++】继承_c++继承_风继续吹TT的博客-CSDN博客#include<iostream>#include<string>usingnamespacestd;classPerson{public: voidPrint() { cout<<"_name_age_sex"<<endl; }protected: string_name; int_age; char......
  • 【做题笔记】网络流24题
    Part1.飞行员配对方案问题Problem有两个集合\(A\),\(B\)。给定正整数\(n\),\(m\)。\(A=\{x|1\leqx\leqm\}\),\(B=\{y|m+1\leqy\leqn\}\)。现在要将\(A\)与\(B\)集合的元素一一配对,有若干个配对关系,形如“\(u\),\(v\)可凑一对”。求有多少个元素能配成一对,并求......