Loading

FWT

FWT

巨佬的blog

P3175 [HAOI2015]按位或
\(E(max(S))\)\(S\) 出现最晚的一位,\(E(min(S))\)\(S\) 出现最早的一位,\(S'\)\(S\) 的补集。
\(E(max(S))=\sum\limits_{T\subseteq S} (-1)^{|T|-1} E(min(T))\)
考虑求 \(E(min(S))\)\(E(min(S))=\dfrac{1}{\sum\limits_{T \cup S \ne \emptyset} p_{T}} = \dfrac{1}{1-\sum\limits_{T \subseteq S'} p_{T}}\)
后面那个 FWT 求即可。

P5643 [PKUWC2018]随机游走
\(E(max(S))\)\(S\) 出现最晚的一个点,\(E(min(S))\)\(S\) 出现最早的一个点。
\(E(max(S))=\sum\limits_{T\subseteq S} (-1)^{|T|-1} E(min(T))\)
为了求 \(E(min(T))\), 然后可以用树形 \(dp\), 令 \(f_i\) 为从 \(i\) 节点到 \(S\) 上的节点的期望用时,然后可以进行推导
最后为了得出对于任意 \(E(max(S))\) 的答案,用 \(FWT\) 求出即可。

P6097 【模板】子集卷积
按照二进制下 \(1\) 的个数来分类(\(|i|\) 表示 \(i\) 二进制下 \(1\) 的个数)。
\(c_{|x|,x} = \sum\limits_{i=0}^{|x|} \sum\limits_{j \subseteq x} a_{i,j} b_{|x|-i,j \oplus i}\)
那么这个东西是对于每一个 \(|x|\) 卷一下就好了,然后统计即可。

CF1034E Little C Loves 3 III
这题本是子集卷积模板,但是卡了时间和空间的限制,所以就变得很难处理。
然后考虑如何优化。定义 \(|a|\)\(a\) 二进制表示中 \(1\) 的个数。我们把原先子集卷积的两维压成一维,原先的赋值 a[|i|][i] = x 变成了 a[i] = (x<<(|i|<<1))
然后直接把两个多项式用 \(\texttt{fwtor}\) 卷起来就好了。
为什么?因为不存在一个 \(a | b = k\), \(|a|+|b|<|k|\)。然而我们要求的是\(|a|+|b|=|k|\),所以错误的答案对正确答案没有影响。

CF772D Varying Kibibits
这道题目是 \(k\) 进制 \(FWT\) 模板。只需要算出个数并的和, \(sum^2\) 并的和, \(sum\) 并的和, 答案就出来了。

CF914G Sum the Fibonacci
模板!!!

CF1119H Triple
及其困难的 FWT, 十分巧妙,要好好复习

SOSdp

子集和:

L(i, 0, 23) L(j, 0, maxn) if(j & (1 << i)) dp[j] += dp[j ^ (1 << i)];

超集和:

L(i, 0, 23) L(j, 0, maxn) if(!(j & (1 << i))) dp[j] += dp[j ^ (1 << i)];

CF165E Compatible Numbers
这道题是 SOSdp 模板,把所有元素丢进去以后 \(dp\), 然后直接取出把每一个数的每一位取反后那个 \(dp\) 值。

CF383E Vowels
仍然是 SOSdp 的模板,只要统计一下错误单词的个数超集和求一下就好了。

CF1208F Bits And Pieces
从后往前一个一个加来统计 \(a or b\)。比较有意思,是用 \(dfs\) 来更新这个 SOSdp 的值。

CF449D Jzzhu and Numbers
这道题目只要用 \(SOSdp\) 来求一下超集和,然后就可以算出包含最后的数 包含 某个数的方案数。
然后用子集反演来求答案即可。

P6442 [COCI2011-2012#6] KOŠARE
板子题,对于每一个玩具选择的状态子集反演一下即可。

posted @ 2020-10-06 14:04  zhoukangyang  阅读(17)  评论(0编辑  收藏  举报