恶补大家小学就会的知识点

其实是一些乱七八糟的基础知识

容斥

nn种限制,算方案数

不满足任何限制

ans=S(1)SfS=i=0n(1)i(ni)fi \begin{aligned} ans &= \sum_{S} (-1)^{|S|}f_S\\ &= \sum_{i=0}^{n}(-1)^{i}\binom{n}{i}f_i \end{aligned}

fSf_S表示钦定满足SS集合限制,其他任意的方案数

fif_i表示钦定满足ii种限制,其他任意的方案数


假设有一种方案满足k>0k>0种限制,那么它会被算这么多次:

(k0)(k1)+(k2)(k3)...+(1)k(kk)=1((k10)+(k11))+((k11)+(k12))...+((k1k1))=1(k10)=0 \begin{aligned} &\binom{k}{0}-\binom{k}{1} + \binom{k}{2} - \binom{k}{3} -...+(-1)^{k}\binom{k}{k}\\ =&1-\Bigg(\binom{k-1}{0}+\binom{k-1}{1}\Bigg)+ \Bigg(\binom{k-1}{1}+\binom{k-1}{2}\Bigg)-...+\Bigg(\binom{k-1}{k-1}\Bigg)\\ =&1-\binom{k-1}{0}\\ =0 \end{aligned}

而只有当k=0k=0时,才会被算(00)=1\binom{0}{0} = 1

所以这样算就对了

至少满足一个限制

ans=i=1n(1)i+1(ni)fi ans = \sum_{i=1}^{n}(-1)^{i+1}\binom{n}{i}f_i

fif_i定义相同,证明方法同上

另外也可以通过维恩图理解

恰好满足k​个限制(广义容斥原理)

gkg_k表示答案

gk=i=kn(1)ik(ik)fi g_k = \sum_{i=k}^{n}(-1)^{i-k}\binom{i}{k}f_i

fif_i定义相同


证明方法只能(我只知道)通过二项式反演。

fk=i=kn(ik)gigk=i=kn(1)ik(ik)fi \begin{aligned} f_k &= \sum_{i=k}^{n}\binom{i}{k}g_i\\ \Rightarrow g_k&=\sum_{i=k}^{n}(-1)^{i-k}\binom{i}{k}f_i \end{aligned}

上面的式子要乘个组合数是因为要枚举出在ii个限制中是哪kk个满足(ff在乱选的时候会算重)

至少满足k个限制(至多类似)

ans=i=kngi ans = \sum_{i=k}^{n}g_i

其中gig_i表示恰好满足ii个限制的方案,于是转化到上一个问题

多项式

一些零碎的东西

在得到一个看起来很像卷积的式子后,先把枚举的部分通过变量替换得到j=0i\displaystyle \sum_{j=0}^{i}的形式

比如,本身式子长这样:j=inf[ji]g[j]\displaystyle \sum_{j=i}^{n}f[j-i]g[j],就可以把jij-i替换成kk,变成k=0nif[k]g[k+i]\displaystyle \sum_{k=0}^{n-i}f[k]g[k+i]

然后通过翻转来凑出卷积的形式

接着上面的式子,把gg数组翻转后得到k=0nif[k]g[nki]\displaystyle \sum_{k=0}^{n-i}f[k]g[n-k-i],这样就能直接卷了,卷出来之后再翻转一下就得到要求的数组了

生成函数

就是把一个数列转化成多项式的形式,转化成更简洁的式子。通过多项式运算,计算系数,来得到答案

用生成函数能快速得到每一项的答案

有时候因为不好直接考虑很多个物品的组合,也可以通过把若干个生成函数直接相乘取[xn][x^n],以方便计算

感觉这东西往往与值域有关

泰勒展开

很好理解的视频

f(x)=n=0f(n)x0n!(xx0)n f(x) = \sum_{n=0}^{\infty}\frac{f^{(n)}x_0}{n!}(x-x_0)^n

其中1n!\frac{1}{n!}是为了把xnx^n一次一次求导后得到的系数n!n!消去

指数型生成函数

在取[xn][x^n]的时候前面要乘一个1n!\frac{1}{n!},因为指数型生成函数会带一个1i!\frac{1}{i!}