题意 题目链接 给出\(n\)个数,问任意选几个数,它们\(\&\)起来等于\(0\)的方案数 Sol 正解居然是容斥原理Orz,然而本蒟蒻完全想不到.. 考虑每一种方案 答案=任意一种方案 - 至少有\(1\)位为\(1\)的方案 + 至少有两位为\(1\)的方案 - 至少有三位为\(1\)的方案 至少有\(i\)位为\(1\)的方案可以dp算,设\(f[x]\)表示满足\(f[x] = a_i \& x = x\)的\(a_i\)的个数 最终答案$ = (-1)^{bit(i)} f[…
[题目链接] http://codeforces.com/problemset/problem/449/D [题目大意] 给出一些数字,问其选出一些数字作or为0的方案数有多少 [题解] 题目等价于给出一些集合,问其交集为空集的方案数, 我们先求交集为S的方案数,记为dp[S],发现处理起来还是比较麻烦, 我们放缩一下条件,求出交集包含S的方案数,记为dp[S], 我们发现dp[S],是以其为子集的方案的高维前缀和, 我们逆序求高维前缀和即可,之后考虑容斥,求出交集为0的情况, 我们发现这个容斥…
D - Jzzhu and Numbers 这个容斥没想出来... 我好菜啊.. f[ S ] 表示若干个数 & 的值 & S == S得 方案数, 然后用这个去容斥. 求f[ S ] 需要用SOSdp #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PLL pair<LL, LL> #define…
题解 刚刚学习了高维前缀和 这道题就肥肠简单了 高维前缀和其实原理肥肠简单 就是每次只考虑一维,然后只做这一维的前缀和 最后求出的就是总前缀和了 那么对于这道题 也就很简单了 发现选择的所有数每一位都必须不能所有数都是1 那么可以考虑一个简单的容斥 设\(g_i\)表示至少\(i\)的二进制下的这几维为1的方案数 那么就可以用类似高维前缀和来统计\(g_i\) 也就是统计ta作为哪些元素的子集 然后枚举选那几位 答案就是\((-1)^{|S|}{2^{g_{i}}}\) 代码 #include<…
题目大意: 给出一个长度为n的序列,构造出一个序列使得它们的位与和为0,求方案数 也就是从序列里面选出一个非空子集使这些数按位与起来为0. 看了好久才明白题解在干嘛,我们先要表示出两两组合位与和为0的所有情况 先hx一下每个数出现的次数,然后我们从遍历 i ,i 是二进制的数位 然后遍历所有的情况,如果第 i 位有1,那么说明我们去掉第 i 位的1就是又一种情况! 其实我们统计的是所有数在删掉/不删掉每一位的1 所有可能出现的数! 那么,状态内任意组合,不能取空集,把空集加上的话,会发现其实是二…
Jzzhu and Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Jzzhu have n non-negative integers a1, a2, ..., an. We will call a sequence of indexes i1, i2, ..., ik (1 ≤ i1 < i2 < ...…
传送门 解题思路 高维前缀和模板题.首先,求前缀和有两种方式,比如说对于求二维前缀和来说. 第一种 : for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]; 这一种其实就相当于用了容斥原理. 第二种 : for(int i=1;i<=n;i++) sum[i][j]+=sum[i-1][j]; for(int i=1;i<=n;i++) sum[i][…
Vertex Covers 时间限制: 5 Sec  内存限制: 128 MB提交: 5  解决: 3 题目描述 In graph theory, a vertex cover of a graph G is a set of vertices S such that each edge of the graph is incident to at least one vertex of the set. That is to say, for every edge (u,v) of the g…
题目链接 \(Description\) \(Solution\) 首先处理\(a_i\)的前缀异或和\(s_i\).那么在对于序列\(a_1,...,a_n\),在\(i\)位置处分开的价值为:\(s_i+s_i\ ^{\wedge}s_n\). 虽然有个加,但依旧可以考虑按位计算.如果\(s_n\)的第\(k\)位为\(1\),那\(s_i\)的第\(k\)位为\(0\)或是\(1\)贡献都是\(2^k\)(贡献即\(s_i+s_i\ ^{\wedge}s_n\)在第\(k\)位上是否为\(…
题目链接 \(Description\) 给定一张\(n\)个点\(m\)条边的无向图.定义割集\(E\)为去掉\(E\)后使得图不连通的边集.定义一个bond为一个极小割集(即bond中边的任意一个真子集都不是割集). 对每条边,求它在多少个bond中. \(n\leq20,\quad n-1\leq m\leq\frac{n(n-1)}{2}\). \(Solution\) https://www.cnblogs.com/zufezzt/p/5723389.html 首先bond是极小割集,…