zoukankan      html  css  js  c++  java
  • 集合幂级数杂题

    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) 值,就能计算强制选一个数方案数了,前缀后缀合并时为集合并卷积。

    链接

  • 相关阅读:
    Entity SQL 初入
    ObjectQuery查询及方法
    Entity Framework 的事务 DbTransaction
    Construct Binary Tree from Preorder and Inorder Traversal
    Reverse Linked List
    Best Time to Buy and Sell Stock
    Remove Duplicates from Sorted Array II
    Reverse Integer
    Implement Stack using Queues
    C++中const限定符的应用
  • 原文地址:https://www.cnblogs.com/lhm-/p/14287558.html
Copyright © 2011-2022 走看看