经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
cf449D. Jzzhu and Numbers(容斥原理 高维前缀和)
来源:cnblogs  作者:自为风月马前卒  时间:2018/11/6 17:58:05  对本文有异议

题意

题目链接

给出\(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\)数组可以通过高维前缀和预处理

  1. #include<bits/stdc++.h>
  2. #define Pair pair<int, int>
  3. #define MP make_pair
  4. #define fi first
  5. #define se second
  6. using namespace std;
  7. const int MAXN = 3e6 + 10, mod = 1e9 + 7, B = 20;
  8. inline int read() {
  9. char c = getchar(); int x = 0, f = 1;
  10. while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
  11. while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  12. return x * f;
  13. }
  14. int N, a[MAXN], bit[65537], f[MAXN];
  15. int add(int &x, int y) {
  16. if(x + y < 0) x = x + y + mod;
  17. else x = (x + y >= mod ? x + y - mod : x + y);
  18. }
  19. int mul(int x, int y) {
  20. return 1ll * x * y % mod;
  21. }
  22. int fp(int a, int p) {
  23. int base = 1;
  24. while(p) {
  25. if(p & 1) base = mul(base, a);
  26. a = mul(a, a); p >>= 1;
  27. }
  28. return base;
  29. }
  30. int get1(int x) {
  31. // return __builtin_popcount(x);
  32. return bit[x & 65535] + bit[x >> 16];
  33. }
  34. int main() {
  35. for(int i = 1; i <= 65536; i++) bit[i] = bit[i >> 1] + (i & 1);
  36. N = read();
  37. for(int i = 1; i <= N; i++) a[i] = read(), f[a[i]]++;
  38. int Lim = (1 << B) - 1, ans = 0;
  39. for(int i = 0; i <= 20; i++)
  40. for(int sta = 0; sta <= Lim; sta++)
  41. if(!(sta & (1 << i))) add(f[sta], f[sta | (1 << i)]);
  42. for(int sta = 0; sta <= Lim; sta++) {
  43. int k = (get1(sta) & 1) ? -1 : 1;
  44. add(ans, mul(k, fp(2, f[sta])));
  45. }
  46. cout << ans;
  47. return 0;
  48. }
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号