题意:给你n(1<=n<=1e6)个数a1,a2,…an(0<=ai<=1e6);问有多少种方案满足 a i 1 & a i 2 & . . . & a i k = 0 ( 1 ≤ k ≤ n ) a_{i1} \& a_{i2} \& ... \& a_{ik} = 0 (1 ≤ k ≤ n) ai1&ai2&...&aik = 0(1 ≤ k ≤ n)
官方题解为:
定义 F ( x ) 为 x & a i = x 的 数 量 F(x) 为 x \& a_{i}=x的数量 F(x)为x&ai=x的数量(很明显,相当于x的父亲的数量)
定义 G ( x ) 为 x 二 进 制 下 的 1 的 数 量 G(x)为x二进制下的1的数量 G(x)为x二进制下的1的数量
则答案为: ∑ i = 0 2 20 ( − 1 ) G ( x ) ∗ 2 F ( x ) \sum_{i=0}^{2^{20}}(-1)^{G(x)}*2^{F(x)} ∑i=0220(−1)G(x)∗2F(x)
然后没了,这让我等吃瓜群众就懵逼了。。。
学了Sosdp的话(没学先去学一手)很容易的计算出F(x),并且明白他的状态的意义(x的父亲的数量),这里不加以阐述了。
我们要求 a i 1 & a i 2 & . . . & a i k = 0 ( 1 ≤ k ≤ n ) a_{i1} \& a_{i2} \& ... \& a_{ik} = 0 (1 ≤ k ≤ n) ai1&ai2&...&aik = 0(1 ≤ k ≤ n), 2 F ( 0 ) 2^{F(0)} 2F(0) 代表着所有ai选还是不选的方案,所以我们还需要减去不合理的方案,哪些是不合理的方案呢,很明显了,所有的F[x]单独都是不合理的,全都需要减去.(因为所有的状态都是0的father) 另外一题同样有意思的题目: 注:该题解借鉴于https://blog.csdn.net/weixin_38686780/article/details/100109753,我只用了自己的话加以描述。 给你N(n<=2e5)次操作,有以下三种操作。 保证 s ∈ [ 0 , 2 16 ] s\in [0,2^{16}] s∈[0,216] 分析:很容易想到当次操作 2 16 2^{16} 216 的做法,这是肯定不行的。 现在讲如何容斥(数学不好,总是在这部分要理解很久。) 总结一下:
但是这里就有一个问题了,比如 11(二进制) 也是 01(二进制) 的父亲,则我F[1]也是包含F[3]的,并且10也是包含11的,所以呢,这不就是容斥吗。明白之后可以直接写了。
注:因为我感觉那个式子应该为 ∑ i = 0 2 20 ( − 1 ) G ( x ) ∗ ( 2 F ( x ) − 1 ) \sum_{i=0}^{2^{20}}(-1)^{G(x)}*(2^{F(x)}-1) ∑i=0220(−1)G(x)∗(2F(x)−1), 然后也AC了,然后我来口胡一下,[0,1<#include
CounterCode 2015 Subset
add s 表示增加一个数 s,
del s 表示删除一个数 s,
cnt s 表示查找满足 a&s=a 的数量。(相当找有多少个儿子)
分析之后发现复杂度跟s的子集有关,相当于 s在二进制下1的数量有关,设cnt[s] 表示 s 在二进制下1的数量,当 cnt[s]<=8时,我们可以直接枚举子集,单次操作 O ( 2 8 ) O(2^{8}) O(28),当 cnt[s]>8 呢?
很容易先想到对 s 取反,设ss为s取反后的数,以前是为了求 a&s=a 的数量 ,现在变为了求 a&ss=0的数量,由于 ss 的 cnt[ss]<=8 ,我们可以枚举子集,然后用容斥算出 cnt[i]<=8的方案数(下面会讲为什么是这样容斥),那 cnt[i]>8的=部分答案我们如何计算呢?因为 cnt[s]>8,a&s=a 等价于算s的儿子数量,我们可以用一个数组F来计算当 cnt[i]>8时,F[i]的儿子数量<==>每个s对齐父亲的贡献为1,可以枚举父亲来实现。
前面已经讲了,现在变为了求 a&ss=0的数量,由于 ss 的 cnt[ss]<=8。我们可以用一个数组E来表示: E[i]代表 cnt[s]<=8 并且s为i的父亲的数量,则E[0]肯定是所有的cnt[s]<=8的数量和,我们要减去不合法的,等价于减去 ((i&ss)!=0) 的部分,这个 i 则一定是ss的儿子(或者叫子集),则一路算过去,相当于答案 = ∑ i = 0 s s ( − 1 ) c n t [ i ] ∗ E [ i ] ( 前 提 是 i 是 s s 的 儿 子 ) \sum_{i=0}^{ss}(-1)^{cnt[i]}*E[i](前提是i是ss的儿子) ∑i=0ss(−1)cnt[i]∗E[i](前提是i是ss的儿子)
#include