学习网址

圆方树:

https://www.cnblogs.com/XuYueming/p/18313014

二项式反演:

https://www.cnblogs.com/GDOI2018/p/14491894.html

从容斥原理出发,通过一些变换便可以推导出二项式反演公式。

假设全集\(U=\{S_1,S_1,...,S_{n-1},S_n\}\)中任意\(i\)个元素的并集、交集的大小都相等。设\(g(x)\)是任意\(x\)个集合的交集,\(f(x)\)是任意\(x\)个集合的补集的交集。特别地,\(g(0)=|U|,f(0)=|U|\)

那么,我们会有以下两条容斥式子:

\(|S_1\cap S_2\cap...\cap S_{n-1}\cap S_n|=|U|-|\overline{S_1}|-|\overline{S_2}|-...+(-1)^n\times |\overline{S_1}\cap \overline{S_2}\cap...\cap\overline{S_{n-1}}\cap \overline{S_n}|=\sum\limits_{i=0}^n(-1)^i\dbinom{n}{i}f(i)\)

\(|\overline{S_1}\cap\overline{ S_2}\cap...\cap \overline{S_{n-1}}\cap \overline{S_n}|=|U|-|{S_1}|-|{S_2}|-...+(-1)^n\times |{S_1}\cap {S_2}\cap...\cap{S_{n-1}}\cap {S_n}|=\sum\limits_{i=0}^n(-1)^i\dbinom{n}{i}g(i)\)

注意到

\[g(n)=|S_1\cap S_2\cap ...\cap S_{n-1}\cap S_n| \]

\[f(n)=|\overline{S_1}\cap\overline{ S_2}\cap...\cap \overline{S_{n-1}}\cap \overline{S_n}| \]

所以,我们就得到了优美的二项式反演:

\[g(n)=\sum\limits_{i=0}^n(-1)^i\dbinom{n}{i}f(i)\Longleftrightarrow f(n)=\sum\limits_{i=0}^n(-1)^i\dbinom{n}{i}g(i) \]

做一个恒等变换,可以得到更加实用的形式:

\[g(n)=\sum\limits_{i=0}^n\dbinom{n}{i}f(i)\Longleftrightarrow f(n)=\sum\limits_{i=0}^n(-1)^{n-i}\dbinom{n}{i}g(i) \]

基础形式:

常见形式:


网络流:

https://www.cnblogs.com/rvalue/p/10650849.html


莫比乌斯反演

https://www.cnblogs.com/peng-ym/p/8647856.html


Latex:


SOS DP

https://www.cnblogs.com/nightsky05/p/15545568.html

​ 实际上我们可以转化一下模型。对于一个数 \(i\) 我们将其转化为二进制,以 \(0110101\) 为例。我们发现,我们可以将这个数字看成一个 \(7\) 维的坐标,然后该数的权值就是这个坐标的权值,那么对于 \(0110101\) 来说,我们要统计的就是相当于所有坐标中满足每一维度的坐标都小于等于 \(0110101\) 每一维度的坐标的权值和。那么这就是个 \(7\) 维偏序,我们可以用高维前缀和解决。由于每一位上的最高值只有 \(2\) 那么总时间复杂度就是 \(O(2^{\log n}\times \log n)\),也就是 \(O(n\log n)\)

​ 而高维前缀和解决这类子集问题的方法,也经常被叫做 SOS dp。也就是说 SOS dp 的本质是高维前缀和。

代码如下:

for(int i=0;i<20;++i)//枚举当前处理哪一维度
	for(int j=0;j<n;++i) 
        if((1<<i)&j) S[j]+=(S[j^(1<<i)]);//如果该维度为1,统计上该维度为0的前缀和
posted @ 2025-07-17 10:19  Wy_x  阅读(28)  评论(0)    收藏  举报