CF582E Boolean Function
四元组 ((A,B,C,D)) 的情况只有 (16) 种,将每种情况的函数值进行状压,在表达式建出的二叉树上进行 (DP),合并子树为对应的卷积。
链接
CF449D Jzzhu and Numbers
先做集合交卷积的莫比乌斯变换,然后快速幂计算选出非空子集的方案数,然后再莫比乌斯反演回去即可。本质为高维前缀和。
链接
CF1392G Omkar and Pies
设两个串分别为 (s,t),每个操作,也就是置换(对换)为 (f_i),定义置换的左作用 (cdot),得答案为:
[large k - d left( left( f_r circ f_{r-1} circ cdots circ f_{l+1} circ f_l
ight) cdot s, t
ight)
]
其中 (d(s,t)) 表示 (s,t) 的汉明距离,即为对应位不同字符个数,进一步得:
[largeegin{aligned}
&d left( left( f_r circ f_{r-1} circ cdots circ f_{l+1} circ f_l
ight) cdot s, t
ight)\
=& d left( s, left( f_r circ f_{r-1} circ cdots circ f_{l+1} circ f_l
ight)^{-1} cdot t
ight) \
=& d left( s, left( f_l^{-1} circ f_{l+1}^{-1} circ cdots circ f_{r-1}^{-1} circ f_r^{-1}
ight) cdot t
ight) \
=& d left( left( f_1^{-1} circ f_2^{-1} circ cdots circ f_{l-1}^{-1}
ight) cdot s, left( f_1^{-1} circ f_2^{-1} circ cdots circ f_r^{-1}
ight) cdot t
ight)
end{aligned}
]
设 (s_i=left( f_1^{-1} circ f_2^{-1} circ cdots circ f_i^{-1}
ight) cdot s,t_i=left( f_1^{-1} circ f_2^{-1} circ cdots circ f_i^{-1}
ight) cdot t),问题就转化为求:
[large min_{j-igeqslant m}d(s_i,t_j)
]
因为 (d(s,t)=|S oplus T|=|S|+|T|-2|S cap T|),所以就是最大化 (|S cap T|),枚举交集 (I),对于 (j-igeqslant m) 的限制,就是求得最小的 (i),使得 (I subseteq S_i),最大的 (j),使得 (I subseteq T_j)。这里是子集的最大最小值,用莫比乌斯变换预处理即可。
链接
[HAOI2015] 按位或
先 (min-max) 容斥,转为求 (E(min(S))),(min(S)) 为集合 (S) 中出现第一个元素的时间,得:
[largeegin{aligned}
E(min(S))&=sum_{i=1}^infty iP(min(S)=i)\
&=sum_{i=1}^infty i(sum_{S cap T=varnothing}p_T)^{i-1}(1-sum_{S cap T=varnothing}p_T)\
&=sum_{i=1}^infty i(sum_{S cap T=varnothing}p_T)^{i-1}-i(sum_{S cap T=varnothing}p_T)^i\
end{aligned}
]
即求形如 (sumlimits_{i=1}^infty ip^i) 的式子,应用扰动法得:
[largeegin{aligned}
&sum_{i=1}^infty ip^i\
=&sum_{i=0}^infty (i+1)p^{i+1}\
=&psum_{i=1}^infty ip^i+sum_{i=0}^infty p^{i+1}\
end{aligned}
]
得 (sumlimits_{i=1}^infty ip^i=frac{p}{(1-p)^2}),代入得:
[large E(min(S))=frac{1}{1-sumlimits_{S cap T=varnothing}p_T}
]
莫比乌斯变换求子集和即可。
还有一种解法:
将 (p) 看作集合幂级数,应用集合并卷积,得期望时间为:
[large f=sum_{i=1}^infty i(p^i-p^{i-1})
]
这个集合幂级数全集的那一项,莫比乌斯变换得:
[large large hat f_S=sum_{i=1}^infty i(hat p^i_S-hat p^{i-1}_S)
]
应用刚才的推导不难得:
[large hat f_S =
egin{cases}
frac{1}{hat p_S-1} & hat p_S < 1 \
0 & hat p_S = 1 \
end{cases}
]
然后再莫比乌斯反演即可。
链接
[NOI Online #3 提高组] 优秀子序列
所求即为选出两两按位与为 (0) 的集合,求集合权值和为 (s) 的方案数。
选出两两按位与为 (0) 的集合其实就是子集卷积,然后 (exp) 即可求集合权值和为 (s) 的方案数。
链接
[CEOI2019] Amusement Park
发现对于任何一种 (DAG) 的方案,将所有边进行翻转后仍为 (DAG),设 (f_S) 为集合 (S) 中的点构成的导出子图为 (DAG) 的方案数,答案即为 (frac{1}{2}mf_U)。
设 (a_S) 表示 (S) 集合是否为独立集,其取值为 (0) 或 (1),用莫比乌斯变换求子集和即可计算 (a_S)。发现直接做会算重,需要容斥:
[large f_S=sum_{T subseteq S}(-1)^{|T|-1}a_Tf_{S-T}
]
考虑怎么得到的容斥系数,设容斥系数为 (f(i)),发现 (f(i)=(-1)^{i-1}) 恰好满足要求,得:
[largeegin{aligned}
&sum_{i=1}^ninom{n}{i}f(i)\
=&sum_{i=1}^ninom{n}{i}(-1)^{i-1}\
=&-left(sum_{i=0}^ninom{n}{i}(-1)^i-inom{n}{0}(-1)^0
ight)\
=&1
end{aligned}
]
设 (g_S=sumlimits_{T subseteq S}(-1)^{|T|-1}a_T),将乘法定义为子集卷积,得:
[largeegin{aligned}
f&=fg+1\
f&=frac{1}{1-g}
end{aligned}
]
求逆即可。
链接
集合划分计数
定义乘法为子集卷积,所求即为:
[large g=explimits_{leqslant k}f=sum_{i=0}^kfrac{f^i}{i!}
]
直接做是 (O(n^32^n)) 的,根据 ({g}'={f}'(g-frac{f^k}{k!})) 做,就是 (O(n^22^n)) 了。
链接
[JOI 2018 Final] 毒蛇越狱
设询问中 (0,1,?) 的个数分别为 (c_0,c_1,c_2)。直接的暴力就是枚举 (?) 的情况,复杂度为 (O(q2^{c_2}))。若不存在 (1),将 (?) 看作 (1),计算子集和即可,若有 (1),进行容斥,复杂度为 (O(q2^{c_1}))。若不存在 (0),将 (?) 看作 (0),计算超集和即可,若有 (0),进行容斥,复杂度为 (O(q2^{c_0}))。根据 (c_0,c_1,c_2) 的大小选择做法,得复杂度为 (O(n2^n+q2^{leftlfloorfrac{n}{3}
ight
floor}))。
链接
[AGC034F] RNG and XOR
正难则反,设初始状态为 (i),目标状态为 (0),期望次数为 (E_i),其中 (E_0=0),(p_i=frac{a_i}{sumlimits_j a_j}),得:
[large E_i=1+sum_{j=0}^{2^n-1}p_jE_{i oplus j}quad left( n
eq 0
ight)
]
发现其为集合对称差卷积,构造集合幂级数,设:
[large E(x)=sum_{i=0}^{2^n-1}E_ix^i,P(x)=sum_{i=0}^{2^n-1}p_ix^i,I=sum_{i=0}^{2^n-1}x^i
]
根据转移有:
[large E(x)=I+E(x)P(x)+cx^{varnothing}
]
最后一项是为了满足 (n=0) 时的情况,进行 (FWT) 得:
[largeegin{aligned}
hat E(x)&=2^nx^{varnothing}+hat E(x)hat P(x)+cI\
hat E(x)(I-hat P(x))&=2^nx^{varnothing}+cI\
left[x^varnothing
ight]hat E(x)(1-[x^varnothing]hat P(x))&=2^n+c\
left[x^varnothing
ight]hat E(x)left(1-sum_{i=0}^{2^n-1}p_i
ight)&=2^n+c\
end{aligned}
]
等号左边的项为 (0),得 (c=-2^n),代入后提取第 (x^S left( S
eq varnothing
ight)) 项系数得:
[largeegin{aligned}
hat E(x)left(hat P(x)-I
ight)&=2^n(I-x^{varnothing})\
left[x^S
ight]hat E(x)left(left[x^S
ight]hat P(x)-1
ight)&=2^n\
end{aligned}
]
不难发现 (left[x^S
ight]hat P(x)
eq 1),得:
[large left[x^S
ight]hat E(x)=frac{2^n}{left[x^S
ight]hat P(x)-1}
]
(IFWT) 后提取第 (x^varnothing) 项系数得,:
[large sum_{i=0}^{2^n-1}left[x^i
ight]hat E(x)=2^nE_0=0
]
然后就能解出 (left[x^varnothing
ight]hat E(x)) 了,求出 (hat E(x)) 后 (IFWT) 即可。
链接
CF1119H Triple
由题意得到 (n) 个集合幂级数,其中 (f_i) 满足 (f_{i,a_i}=x,f_{i,b_i}=y,f_{i,c_i}=z)。将 (n) 个幂级数进行异或卷积即可得到答案,但直接卷积复杂度无法接受。
发现每个幂级数都只有三个非零项,对其进行 (FWT) 得:
[large hat f_{i,S}=sum_{Tsubseteq 2^U}(-1)^{|S cap T|}f_{i,T}=(-1)^{|S cap a_i|}x+(-1)^{|S cap b_i|}y+(-1)^{|S cap c_i|}z
]
设最后所求的幂级数为 (f),得:
[large hat f_S=prod_{i=1}^nhat f_{i,S}=prod_{i=1}^n(-1)^{|S cap a_i|}x+(-1)^{|S cap b_i|}y+(-1)^{|S cap c_i|}z
]
为简化问题,将三元组 ({ a_i,b_i,c_i }) 转化为 ({ 0,b_i ext{xor} a_i,c_i ext{xor} a_i }),最后统计答案时,将幂级数对应的下标异或上 ( ext{xor}_{i=1}^n a_i) 即可。这样的话,((-1)^{|S cap a_i|}x+(-1)^{|S cap b_i|}y+(-1)^{|S cap c_i|}z) 就只有四种可能的取值了:
[large x+y+z,
x+y-z,
x-y+z,
x-y-z
]
求出每种出现次数,快速幂就能求出 (hat f_S) 了。设每种出现次数分别为 (c_1,c_2,c_3,c_4)。显然有 (c_1+c_2+c_3+c_4=n)。
考虑三个幂级数 (g_1,g_2,g_3),其分别满足:
[large g_{1,S}=sum_{i=1}^n[b_i=S],g_{2,S}=sum_{i=1}^n[c_i=S],g_{3,S}=sum_{i=1}^n[b_i ext{xor}c_i=S]
]
对其进行 (FWT),不难发现:
[large
hat{g}_{1,S}=c_1+c_2-c_3-c_4,
hat{g}_{2,S}=c_1-c_2+c_3-c_4,
hat{g}_{3,S}=c_1-c_2-c_3+c_4
]
根据方程解出 (c_1,c_2,c_3,c_4) 即可。
链接
CF772D Varying Kibibits
发现 (f) 这个函数的按位取 (min),其实就是十进制下的按位与,那么先做十进制的莫比乌斯变换,计算超集和。考虑如何统计答案,现在要计算的即为:
[large sum_{T subseteq S}left( sum_{i in T} a_i
ight)^2
]
也就是集合中所有子集的和的平方,考虑两个元素 (i,j) 的贡献,不难得:
[largeegin{aligned}
&sum_{T subseteq S}left( sum_{i in T} a_i
ight)^2\
=&2^{|S|-2}sum_{i in S}sum_{j in S and i
eq j}a_i a_j+2^{|S|-1}sum_{i in S} a_i^2\
=&2^{|S|-2}sum_{i in S}sum_{j in S and i
eq j}a_i a_j+2^{|S|-2}sum_{i in S} a_i^2+2^{|S|-2}sum_{i in S} a_i^2\
=&2^{|S|-2}left( sum_{i in S} a_i
ight)^2+2^{|S|-2}sum_{i in S} a_i^2\
end{aligned}
]
莫比乌斯变换处理出 (|S|,sum_limits{i in S} a_i,sumlimits_{i in S} a_i^2) 后即可计算,然后再莫比乌斯反演就为答案。
链接
[ZJOI2019] 开关
和 ([AGC034F] RNG and XOR) 一样,设集合幂级数 (E(x),P(x)),由那题得 (left[x^S
ight]hat E(x)=frac{2^n}{left[x^S
ight]hat P(x)-1}),根据本题的性质进一步推导:
[largeegin{aligned}
&left[x^S
ight]hat E(x)\
=&frac{2^n}{left[x^S
ight]hat P(x)-1}\
=&frac{2^n}{sumlimits_{i=1}^n(-1)^{|S cap { i}|}p_i-1}\
=&frac{-2^n}{2sumlimits_{iin S}p_i}\
end{aligned}
]
得答案为:
[largeegin{aligned}
&frac{1}{2^n}sum_T(-1)^{|S cap T|}left[x^T
ight]hat E(x)\
=&frac{1}{2^n}left(sum_{T
eq varnothing}(-1)^{|S cap T|}left[x^T
ight]hat E(x)+left[x^varnothing
ight]hat E(x)
ight)\
=&frac{1}{2^n}left(sum_{T
eq varnothing}(-1)^{|S cap T|}frac{-2^n}{2sumlimits_{iin T}p_i}+sum_{T
eq varnothing}frac{2^n}{2sumlimits_{iin T}p_i}
ight)\
=&sum_{T
eq varnothing}frac{(-1)^{|S cap T|+1}+1}{2sumlimits_{iin T}p_i}\
=&sum_Tfrac{left[ |S cap T| equiv 1 pmod{2}
ight]}{sumlimits_{iin T}p_i}\
end{aligned}
]
发现 (sumlimits_{i=1}^n p_i) 很小,对其做背包计数即可计算答案,背包过程需记录 (|S cap T|) 的奇偶性。
链接
[PKUWC2018] 随机游走
先 (min-max) 容斥,转为求 (E(min(S))),即从根到点集 (S) 中第一个点的期望步数。
枚举当前考虑的点集 (S),设 (f_x) 为 (x) 到点集 (S) 中第一个点的期望步数,(d_x) 为 (x) 的度数,若 (xin S),则有 (f_x=0),否则有:
[large f_x=1+frac{1}{d_x}sum_{i=1}^{d_x} f_{y_i}
]
直接高斯消元是 (O(n^3)) 的,有一个树上消元的技巧能快速计算,将每个点的 (DP) 值用其父亲的 (DP) 值表示,即:
[large f_x=k_xf_{fa}+b_x
]
得:
[largeegin{aligned}
f_x&=1+frac{1}{d_x}sum_{i=1}^{d_x} f_{y_i}\
&=1+frac{1}{d_x}left( sum_{yin son}k_yf_x+b_y+f_{fa}
ight)\
&=frac{frac{1}{d_x}f_{fa}+frac{1}{d_x}sumlimits_{yin son}b_y+1}{1-frac{1}{d_x}sumlimits_{yin son}k_y} \
end{aligned}
]
计算出每个点集的期望步数后,用莫比乌斯反演求子集和即可快速回答询问。
链接
[SNOI2017] 遗失的答案
将 (n,l,x) 都除以 (g),问题转化为在 (left[1,n
ight]) 中选数,必须选 (x),求选出的数 (gcd) 为 (1),( ext{lcm}) 为 (l) 的方案数。
发现 (l) 最多有 (8) 个质因子,考虑状压。(left[1,n
ight]) 中每个数对应的状态为: 该数中 (l) 的每个质因子的指数是否为 (0),每个质因子的指数是否和 (l) 一样。选一个数就是状态按位或。
发现很多数状态一样,放到一起来考虑,并且只需考虑 (l) 的约数,发现有用的状态种数为 (600) 左右。维护前缀的 (DP) 值和后缀的 (DP) 值,就能计算强制选一个数方案数了,前缀后缀合并时为集合并卷积。
链接