题意

题目链接

给出\(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[i]$

\(f\)数组可以通过高维前缀和预处理

#include<bits/stdc++.h>
#define Pair pair<int, int>
#define MP make_pair
#define fi first
#define se second
using namespace std;
const int MAXN = 3e6 + 10, mod = 1e9 + 7, B = 20;
inline int read() {char c = getchar(); int x = 0, f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f;
}
int N, a[MAXN], bit[65537], f[MAXN];
int add(int &x, int y) {if(x + y < 0) x = x + y + mod;else x = (x + y >= mod ? x + y - mod : x + y);
}
int mul(int x, int y) {return 1ll * x * y % mod;
}
int fp(int a, int p) {int base = 1;while(p) {if(p & 1) base = mul(base, a);a = mul(a, a); p >>= 1;}return base;
}
int get1(int x) {
//  return __builtin_popcount(x);return bit[x & 65535] + bit[x >> 16];
}
int main() {for(int i = 1; i <= 65536; i++) bit[i] = bit[i >> 1] + (i & 1);N = read();for(int i = 1; i <= N; i++) a[i] = read(), f[a[i]]++;int Lim = (1 << B) - 1, ans = 0;for(int i = 0; i <= 20; i++)for(int sta = 0; sta <= Lim; sta++) if(!(sta & (1 << i))) add(f[sta], f[sta | (1 << i)]);for(int sta = 0; sta <= Lim; sta++) {int k = (get1(sta) & 1) ? -1 : 1;add(ans, mul(k, fp(2, f[sta])));}cout << ans;return 0;
}

cf449D. Jzzhu and Numbers(容斥原理 高维前缀和)相关推荐

  1. 『容斥·状压』CF449D Jzzhu and Numbers

    P r o b l e m \mathrm{Problem} Problem 给出一个长度为n的序列 a 1 , a 2 . . . a n a_1,a_2...a_n a1​,a2​...an​. ...

  2. sosdp(高维前缀和)学习笔记

    高维前缀和 我们先看一维前缀和 for(int i=1;i<=n;i++) s[i]+=s[i-1]; 那么二维前缀和 for(int i=1;i<=n;i++) for(int j=1; ...

  3. Codeforces Round #257 (Div. 1) D. Jzzhu and Numbers 高维前缀和 + 容斥

    传送门 文章目录 题意: 思路: 题意: 思路: 完全想不到容斥啊,看了半天也没看懂渍渍渍. 定义f[i]f[i]f[i]表示iii的超集个数,那么选择的方案就是2f[i]−12^{f[i]}-12f ...

  4. SPOJ.TLE - Time Limit Exceeded(DP 高维前缀和)

    题目链接 \(Description\) 给定长为\(n\)的数组\(c_i\)和\(m\),求长为\(n\)的序列\(a_i\)个数,满足:\(c_i\not\mid a_i,\quad a_i\& ...

  5. Deltix Round, Spring 2021 D. Love-Hate 随机化 + sos dp(高维前缀和)

    传送门 文章目录 题意: 思路: 题意: 给你nnn个朋友,一共有mmm种货币,一个朋友最多喜欢ppp种,用二进制给出111代表喜欢,让你选出最多的一个货币集合使得至少有⌈n2⌉\left \lcei ...

  6. ARC106E-Medals【hall定理,高维前缀和】

    正题 题目链接:https://atcoder.jp/contests/arc106/tasks/arc106_e 题目大意 nnn个员工,第iii个在[1,Ai][1,A_i][1,Ai​]工作,[ ...

  7. HDU5765 Bonds (高维前缀和)

    HDU5765 Bonds (高维前缀和) 题意:\(n(n<=20)\)个点\(m\)条边无向图,求每条边出现在多少个\(Bond\)里.一个图的\(cut\)指,对于一个图\(G\)的边集的 ...

  8. BZOJ5092:[Lydsy1711月赛]分割序列(贪心,高维前缀和)

    Description 对于一个长度为n的非负整数序列b_1,b_2,...,b_n,定义这个序列的能量为:f(b)=max{i=0,1,...,n}((b_1 xor b_2 xor...xor b ...

  9. [JZOJ5952] 凯旋而归 ([BZOJ 5092]【Lydsy1711月赛】分割序列)【高维前缀和】【DP】

    Description 对于一个长度为m的序列a,记f(a)=max⁡((a1xor...xorai)+(ai+1xor...xoran)),i∈[0,m]f(a)=\max((a_1\ xor\ . ...

最新文章

  1. mysql in sql注入_在 SQL 注入攻击中检查数据库
  2. [NPUCTF2020]芜湖(Base64隐写)
  3. 同步规则和happen-before规则
  4. 动态规划算法实验报告_强化学习之动态规划算法
  5. sendmail发送html邮件,尝试使用sendmail发送/发送html电子邮件,但显示电子邮件的源代码...
  6. 信息学奥赛一本通(1187:统计字符数)
  7. 顺序存取和随机存取的区别_内存和硬盘的区别
  8. Go实现短url项目
  9. javascript 原生事件综合查询
  10. STM32 DCMI调试
  11. matlab中integrator,matlab:Simulink Integrator的理解
  12. 秘鲁蓝莓国际农民丰收节贸易会-·万祥军:谋定对华市场准入
  13. iOS开发之 简易随机点名册的设计
  14. java单词匹配算法_前端学数据结构与算法(八): 单词前缀匹配神器-Trie树的实现及其应用...
  15. java录制视频_javacv开发详解之1:调用本机摄像头视频(建议使用javaCV最新版本)...
  16. java 汉字转拼音缩写_汉字转拼音 java 工具类
  17. 面试常被问你做的项目有啥亮点,你该怎么答?
  18. Excel翻译功能怎么用?这3个翻译方法简直太好用了
  19. python12306抢学生票票下载_再不看就晚了,我用Python抢到了回家的火车票!
  20. MySQL(六):数据库的导入和导出+索引+用户权限管理

热门文章

  1. 要提升asp.net工作能力。应急于提升的是哪些技术?
  2. C语言 int** 二重指针的理解
  3. Log4j 入门总结
  4. C#winform抓取百度,Google搜索关键词结果
  5. java编写sql语句,java实现简单的给sql语句赋值的示例
  6. react 导航条选中颜色_调整安卓手机的颜色以更好地查看一切
  7. 按15分钟取数据_Python爬取猫眼电影《飞驰人生》4万多条评论并对其进行数据分析...
  8. Java线程中断机制-如何中断线程
  9. 蒙特卡罗方法介绍(一)
  10. 互联网晚报 | 12月27日 星期一 | 蚂蚁消费金融增资220亿;小米MIUI13正式官宣;《蜘蛛侠3》登顶全球年度票房冠军...