淺談各種反演

前言 (chě dàn)

反演好神奇啊
就像 魔法一樣
在這裏插入圖片描述

反演在OI界還是一個非常常用的一個東西,覺得還是寫個總結好一點

前置知識

二項式定理 : (證明可通過數學歸納法)
在這裏插入圖片描述

正文

定義

何爲反演 ?
我是通俗理解爲已知 A 求 B爲正演, 那已知 B 求 A爲反演

在OI中一般 A, B爲函數,如f(x), g(x)之類的

引入

先通過一個例題引入

有 n 個人站成一排, 編號爲1, 2, 3, …, n, 假設編號爲i的不能站在第i個位置,求可行的方案數 (經典的錯排問題)

首先作爲一個初中生,當然可以想到容斥

在這裏插入圖片描述

爲什麼這個公式是成立的
考慮要算m(m >= 1)個人站對的情況, 算0 ~ m-1個人的時候會將當前m個人的方案多算這麼多次
在這裏插入圖片描述

既然是負的,加回去就好了,於是容斥公式成立

另一個角度

f(n)n便g(n)n設f(n)爲n個人隨便站的方案數,g(n)爲n個人錯排的方案數,我們可以枚舉有幾個人站錯,可得

在這裏插入圖片描述
這個就是正演
但是我們好像只知道f(n)f(n),於是我們需要反演求出g(n)g(n)

各種反演

開始前先看一些性質

上面設的那個東西
在這裏插入圖片描述

前面推容斥的時候有一步是要用

k=0n(1)k(nk)=(1+(1))n=0n\Large \sum\limits_{k=0}^n(-1)^k \begin{pmatrix} n \\ k \end{pmatrix} = (1 + (-1))^n=0^n

當n=0時值爲1,否則爲0

k=0n(1)k(nk)=[n==0](1)\Large \sum\limits_{k=0}^n(-1)^k \begin{pmatrix} n \\ k \end{pmatrix} = [n==0]…… (1)

首先知道一個顯然的東西
g(n)=m=0n[nm==0](nm)g(m)\large g(n)=\sum\limits_{m=0}^n[n-m==0]\begin{pmatrix} n \\ m \end{pmatrix}g(m)

前面提到的性質
k=0n(1)k(nk)=[n==0](1)\large \sum\limits_{k=0}^n(-1)^k \begin{pmatrix} n \\ k \end{pmatrix} = [n==0]…… (1)
把它帶進去

g(n)=m=0nk=0nm(1)k(nmk)(nm)g(m)\large g(n)=\sum\limits_{m=0}^n\sum\limits_{k=0}^{n-m}(-1)^k \begin{pmatrix} n-m \\ k \end{pmatrix}\begin{pmatrix} n \\ m \end{pmatrix}g(m)
(nmk)(nm)nmk注意到\begin{pmatrix} n-m \\ k \end{pmatrix}\begin{pmatrix} n \\ m \end{pmatrix}的意思時從大小爲n的集合中先取m個,再從剩下的中取k個的方案數 km(nkm)(nk),和先取k個,再從剩下的當中取m個的方案數相同\begin{pmatrix} n-k \\ m \end{pmatrix}\begin{pmatrix} n \\ k \end{pmatrix}
  g(n)=m=0nk=0nm(1)k(nmk)(nm)g(m)\ \ \large g(n)=\sum\limits_{m=0}^n\sum\limits_{k=0}^{n-m}(-1)^k \begin{pmatrix} n-m \\ k \end{pmatrix}\begin{pmatrix} n \\ m \end{pmatrix}g(m)

=g(n)=m=0nk=0nm(1)k(nkm)(nk)g(m)\large g(n)=\sum\limits_{m=0}^n\sum\limits_{k=0}^{n-m}(-1)^k \begin{pmatrix} n-k \\ m \end{pmatrix}\begin{pmatrix} n \\ k \end{pmatrix}g(m)
交換求和符號

g(n)=k=0n(1)k(nk)m=0nk(nkm)g(m)\large g(n)=\sum\limits_{k=0}^{n}(-1)^k \begin{pmatrix} n \\ k \end{pmatrix}\sum\limits_{m=0}^{n-k}\begin{pmatrix} n-k \\ m \end{pmatrix}g(m)

然後我們發現一個很棒的東西
m=0nk(nkm)g(m)=f(nk)\large \sum\limits_{m=0}^{n-k}\begin{pmatrix} n-k \\ m \end{pmatrix}g(m) = f(n-k)
所以
g(n)=k=0n(1)k(nk)m=0nk(nkm)g(m)\large g(n)=\sum\limits_{k=0}^{n}(-1)^k \begin{pmatrix} n \\ k \end{pmatrix}\sum\limits_{m=0}^{n-k}\begin{pmatrix} n-k \\ m \end{pmatrix}g(m)
        =k=0n(1)k(nk)f(nk)\large \ \ \ \ \ \ \ \ = \sum\limits_{k=0}^{n}(-1)^k \begin{pmatrix} n \\ k \end{pmatrix} f(n-k)

換一下下標
因爲(nnk)=(nk)\begin{pmatrix} n \\ n- k \end{pmatrix} = \begin{pmatrix} n \\ k \end{pmatrix}
g(n)=k=0n(1)nk(nk)f(k)(2)\large g(n) = \sum\limits_{k=0}^{n}(-1)^{n-k} \begin{pmatrix} n \\ k \end{pmatrix} f(k) …… (2)

二項式反演

先直接給出公式
已知
f(n)=k=0n(nk)g(k)\Large f(n)= \sum\limits_{k=0}^n\begin{pmatrix} n \\ k \end{pmatrix}g(k)
可得
g(n)=k=0n(1)nk(nk)f(k)\Large g(n)=\sum\limits_{k=0}^n(-1)^{n-k} \begin{pmatrix} n \\ k \end{pmatrix}f(k)
一般寫成

f(n)=k=0n(nk)g(k)g(n)=k=0n(1)nk(nk)f(k)\Large f(n)= \sum\limits_{k=0}^n\begin{pmatrix} n \\ k \end{pmatrix}g(k) ⇔ \Large g(n)=\sum\limits_{k=0}^n(-1)^{n-k} \begin{pmatrix} n \\ k \end{pmatrix}f(k)

發現和上面的2一樣誒
那就不用證了 (笑)

還有另外一個公式

f(n)=k=0n(1)k(nk)g(k)g(n)=k=0n(1)k(nk)f(k)\Large f(n)=\sum\limits_{k=0}^n(-1)^{k} \begin{pmatrix} n \\ k \end{pmatrix}g(k)⇔g(n)=\sum\limits_{k=0}^n(-1)^{k} \begin{pmatrix} n \\ k \end{pmatrix}f(k)
這個東西看起來十分對稱,非常好記
它的證明也很簡單 根據容斥證明就好了

另外有一個更常用的公式

f(n)=k=nm(kn)g(k)g(n)=k=nm(1)kn(kn)f(k)\Large f(n)= \sum\limits_{k=n}^m\begin{pmatrix} k \\ n \end{pmatrix}g(k) ⇔ \Large g(n)=\sum\limits_{k=n}^m(-1)^{k-n} \begin{pmatrix} k \\ n \end{pmatrix}f(k)

證明

把右邊的代入左邊
f(n)=k=nm(kn)g(k)f(n)= \sum\limits_{k=n}^m\begin{pmatrix} k \\ n \end{pmatrix}g(k)
         =k=nm(kn)j=km(jk)(1)jkf(j)\ \ \ \ \ \ \ \ \ = \sum\limits_{k=n}^m\begin{pmatrix} k \\ n \end{pmatrix} \sum\limits_{j=k}^m\begin{pmatrix} j \\ k \end{pmatrix}(-1)^{j-k}f(j)
         =j=nmf(j)k=nj(kn)(jk)(1)jk\ \ \ \ \ \ \ \ \ =\sum\limits_{j=n}^m f(j)\sum\limits_{k=n}^j\begin{pmatrix} k \\ n \end{pmatrix}\begin{pmatrix} j \\ k \end{pmatrix}(-1)^{j-k}

(jk)(kn)jkkn注意到\begin{pmatrix} j \\ k \end{pmatrix}\begin{pmatrix} k \\ n \end{pmatrix}的意思時從大小爲j的集合中先取k個,再從取的k箇中取n個的方案數 njnkn(jn)(jnkn),和先取n個,再從剩下j-n的當中取k-n個的方案數相同\begin{pmatrix} j \\ n \end{pmatrix}\begin{pmatrix} j-n \\ k-n \end{pmatrix}
(jnkn)=(jnjn(kn))=(jnjk)因爲\begin{pmatrix} j-n \\ k-n \end{pmatrix} = \begin{pmatrix} j-n \\ j - n -(k-n) \end{pmatrix}=\begin{pmatrix} j-n \\ j-k \end{pmatrix}
f(n)=j=nmf(j)k=nj(jn)(jnjk)(1)jkf(n)=\sum\limits_{j=n}^m f(j)\sum\limits_{k=n}^j\begin{pmatrix} j \\ n \end{pmatrix}\begin{pmatrix} j-n \\ j-k \end{pmatrix}(-1)^{j-k}
         =j=nm(jn)f(j)k=nj(jnjk)(1)jk\ \ \ \ \ \ \ \ \ =\sum\limits_{j=n}^m \begin{pmatrix} j \\ n \end{pmatrix}f(j)\sum\limits_{k=n}^j\begin{pmatrix} j-n \\ j - k \end{pmatrix}(-1)^{j-k}
設 t = j - k
         =j=nm(jn)f(j)t=0jn(jnt)(1)t\ \ \ \ \ \ \ \ \ =\sum\limits_{j=n}^m \begin{pmatrix} j \\ n \end{pmatrix}f(j)\sum\limits_{t=0}^{j-n}\begin{pmatrix} j-n \\ t \end{pmatrix}(-1)^{t}
看看右邊那個東西,發現是不是有點眼熟

就是性質1
k=0n(1)k(nk)=[n==0](1)\large \sum\limits_{k=0}^n(-1)^k \begin{pmatrix} n \\ k \end{pmatrix} = [n==0]…… (1)

f(n)=j=nm(jn)f(j)[jn==0]f(n)=\sum\limits_{j=n}^m \begin{pmatrix} j \\ n \end{pmatrix}f(j)[j-n==0]

f(n)=j=nm(jn)f(j)[j==n]f(n)=\sum\limits_{j=n}^m \begin{pmatrix} j \\ n \end{pmatrix}f(j)[j==n]
f(n)=(nn)f(n)[n==n]f(n)=\begin{pmatrix} n \\ n \end{pmatrix}f(n)[n==n]
f(n)=f(n)f(n)=f(n)
得證

一般的用法:

f(n)爲先欽定n個,然後剩下隨便搞的方案數(肯定會算重複) (不是簡單的後綴和,而是先欽定n個的所有情況,然後剩下隨便搞的和)
g(n)爲恰好n個
顯然
f(n)=k=nm(kn)g(k)\Large f(n)= \sum\limits_{k=n}^m\begin{pmatrix} k \\ n \end{pmatrix}g(k)
一般f(n)f(n)是很容易算的,那麼
g(n)=k=nm(1)kn(kn)f(k)\Large g(n)=\sum\limits_{k=n}^m(-1)^{k-n} \begin{pmatrix} k \\ n \end{pmatrix}f(k)

莫比烏斯反演

f(n)=dng(d)g(n)=dnμ(d)f(n/d)\Large f(n)=\sum\limits_{d|n}g(d)⇔g(n)=\sum\limits_{d|n}\mu (d)f(n/d)

前置知識

首先要知道 μ\mu是個什麼函數
d=1,μ(d)=1若d = 1, \mu(d) = 1
d=p1p2p3....pk,p,μ(d)=(1)k若d=p_1 * p_2 * p_3 * .... * p_k, 其中p爲質數且互不相同,那麼 \mu(d) = (-1)^k
μ(d)=0其他情況 \mu(d) = 0

μ\mu 的一些性質

首先它是一個積性函數
就是若 a, b互質
則滿足 μ(ab)=μ(a)μ(b)\large \mu(ab)=\mu(a)\mu(b)
證明很顯然啊
然後就可以線性篩了

還有一個很重要的性質
dnμ(d)=[n==1]\large \sum\limits_{d|n}\mu(d) =[n==1]
這個證明也很顯然,先把n質因數分解,去掉重複的質因數
假設爲 p1,p2,....,pmp_1,p_2, ...., p_m

上面那條式子就等價於 k=0m(1)k(mk)\sum\limits_{k=0}^m(-1)^k\begin{pmatrix} m \\ k \end{pmatrix}
這條式子是不是有點熟悉, 就是上面的性質1
k=0n(1)k(nk)=[n==0](1)\sum\limits_{k=0}^n(-1)^k \begin{pmatrix} n \\ k \end{pmatrix} = [n==0]…… (1)
所以
k=0m(1)k(mk)=[m==0]\sum\limits_{k=0}^m(-1)^k\begin{pmatrix} m \\ k \end{pmatrix}=[m==0]

m==0n1m==0的時候n只能爲1
所以成立

證明

讓我們回憶我們證明二項式反演的時候幹了什麼?
找了個n=0時才爲1的東西,然後搞了個顯然的東西,把前一個帶入後面一個就搞出了反演

類似的我們可以搞一搞

dnμ(d)=[n==1]\large \sum\limits_{d|n}\mu(d) =[n==1]
顯然的
g(n)=mn[nm==1]g(m)\large g(n)=\sum\limits_{m|n}[\frac{n}{m}==1]g(m)
把上面的代入下面
g(n)=mndnmμ(d)g(m)g(n)=\sum\limits_{m|n}\sum\limits_{d|\frac{n}{m}}\mu(d) g(m)

注意到dnmmdnmndd|\frac{n}{m}就是md|n和m|\frac{n}{d}是等價的
所以
g(n)=mnmndμ(d)g(m)g(n)=\sum\limits_{m|n}\sum\limits_{m|\frac{n}{d}}\mu(d) g(m)
同樣交換求和符號
g(n)=dnμ(d)mndg(m)g(n)=\sum\limits_{d|n}\mu(d) \sum\limits_{m|\frac{n}{d}} g(m)
右邊那個東西是不是有點熟悉
就是f(n)=dng(d)f(n)=\sum\limits_{d|n}g(d)
所以
g(n)=dnμ(d)f(n/d)g(n) =\sum\limits_{d|n}\mu(d)f(n/d)

證畢

另一種形式

f(n)=ndg(d)g(n)=ndμ(d/n)f(d)\Large f(n)=\sum\limits_{n|d}g(d)⇔g(n)=\sum\limits_{n|d}\mu (d/n)f(d)
類比二項式反演的證明
把右邊的代入左邊
f(n)=ndg(d)f(n)=\sum\limits_{n|d}g(d)

         =nddmμ(m/d)f(m)\ \ \ \ \ \ \ \ \ =\sum\limits_{n|d}\sum\limits_{d|m}\mu (m/d)f(m)
         =nmtmnm/nμ(m/tn)f(m)\ \ \ \ \ \ \ \ \ =\sum\limits_{n|m}\sum\limits_{t|\frac{m}{n}}^{m/n}\mu (m/tn)f(m)
m/n=Tm/n=T
f(n)=nmtmnTμ(T/t)f(m)f(n) =\sum\limits_{n|m}\sum\limits_{t|\frac{m}{n}}^{T}\mu (T/t)f(m)
         =nmf(m)tTTμ(T/t)\ \ \ \ \ \ \ \ \ =\sum\limits_{n|m}f(m)\sum\limits_{t|T}^{T}\mu (T/t)

可以很容易發現
tTTμ(T/t)=tTTμ(t)\sum\limits_{t|T}^{T}\mu (T/t)=\sum\limits_{t|T}^{T}\mu (t)
f(n)=nmf(m)tTTμ(t)f(n) =\sum\limits_{n|m}f(m)\sum\limits_{t|T}^{T}\mu (t)
右邊那個東西是不是又很熟悉
dnμ(d)=[n==1]\large \sum\limits_{d|n}\mu(d) =[n==1]
就是這個東西
所以
f(n)=nmf(m)[T==1]f(n) =\sum\limits_{n|m}f(m)[T==1]
         =nmf(m)[m/n==1]\ \ \ \ \ \ \ \ \ =\sum\limits_{n|m}f(m)[m/n==1]
         =nmf(m)[m==n]\ \ \ \ \ \ \ \ \ =\sum\limits_{n|m}f(m)[m==n]
         =f(n)\ \ \ \ \ \ \ \ \ =f(n)

證畢

一般用法

設g(n)爲gcd(x, y) == n的對數
設f(n)爲n | gcd(x,y)的對數 (1 <= x <= N, 1 <= y <= M)

顯然滿足
f(n)=ndg(d)\large f(n)=\sum\limits_{n|d}g(d)
一般f(n)很容易算就是
f(n)=Nn×Mn\large f(n)= \lfloor\frac{N}{n}\rfloor \times\lfloor\frac{M}{n}\rfloor
那麼顯然
g(n)=ndμ(d/n)f(d)\large g(n)=\sum\limits_{n|d}\mu (d/n)f(d)
         =ndμ(d/n)Nd×Md\large \ \ \ \ \ \ \ \ \ = \sum\limits_{n|d}\mu (d/n) \lfloor\frac{N}{d}\rfloor \times\lfloor\frac{M}{d}\rfloor

做題前還有一個東西必須要掌握 : 整除分塊
有些題推出來的式子你會發現有整除,然而對於一個數除以一段連續的數得到的結果是相同的
舉個例子

i 1 2 3 4 5 6 7
10/i\lfloor 10/i\rfloor 10 5 3 2 2 1 1

那已知左端點,如何求右端點?
右端點r=n/(n/l)r=n/(n/l)

反正也不難記,先記着,後面有時間再證明(flag)

可見連續一段是相等的

    for(int l=1,r;l<=n;l=r+1) {
        r= n / (n / l); 
        計算l ~ r這段的結果
    }

對於兩個數n,mn,m的類比做一下就好了

	for(int l = 1, r = 0; l <= n; l = r + 1) {
		r = min(n / (n / l), m / (m / l));
		計算l ~ r這段的結果	
	}

兩年前自己寫的關於莫比烏斯反演的垃圾 : 莫比烏斯反演(懵逼鎢絲繁衍)
裏面有幾道題

子集反演

就是裸的容斥
在這裏插入圖片描述

FWT

之前寫過 淺談FWT

子集卷積

同上,數組多開一維記一下集合大小就好了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章