题意

给n个整数,求满足子集异或和为0的子集大小之和。

分析

将问题转化为求每个元素的贡献次数之和。

先对n个数求线性基,设线性基大小为r,即插入线性基的数字个数为r,可以分别计算线性基内数的贡献和线性基外的数的贡献

  • 线性基外:共n-r个数,枚举每个数x,它可以和将线性基外剩余的n-r-1个数同时存在一个集合内,显然共有\(2^{n-r-1}\)个集合,所以x的贡献为\(2^{n-r-1}\)。
  • 线性基内:枚举每个数x,将剩余的n-1个数再求一次线性基,设为B,分两种情况:
    • x不能被B异或出。那么显然x不能在任意一个集合中出现,x的贡献为0。
    • x可以被B异或出。此时B的大小必定也为r,因为B已经能表示所有n个数了。那么在除去x和B的情况下,x可以和剩余的n-r-1个数同时存在一个集合内,x的贡献为\(2^{n-r-1}\)。

Code

  1. #include<bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pb push_back
  5. #define ll long long
  6. using namespace std;
  7. const int inf=1e9;
  8. const int mod=1e9+7;
  9. const int maxn=1e5+10;
  10. int n;
  11. ll a[maxn];
  12. struct node{
  13. ll p[65];
  14. int cnt;
  15. void clear(){
  16. cnt=0;
  17. memset(p,0,sizeof(p));
  18. }
  19. bool insert(ll x){
  20. for(int i=60;i>=0;i--){
  21. if(x&(1ll<<i)){
  22. if(!p[i]){
  23. p[i]=x;cnt++;
  24. return 1;
  25. }
  26. x^=p[i];
  27. }
  28. }
  29. return 0;
  30. }
  31. };
  32. node x,y,z;
  33. ll ksm(ll a,ll b){
  34. ll ret=1;
  35. while(b){
  36. if(b&1) ret=ret*a%mod;
  37. b>>=1;
  38. a=a*a%mod;
  39. }
  40. return ret;
  41. }
  42. int main(){
  43. //ios::sync_with_stdio(false);
  44. //freopen("in","r",stdin);
  45. while(~scanf("%d",&n)){
  46. x.clear();y.clear();z.clear();
  47. for(int i=1;i<=n;i++){
  48. scanf("%lld",&a[i]);
  49. }
  50. vector<ll>q,res;
  51. for(int i=1;i<=n;i++){
  52. if(x.insert(a[i])){
  53. q.pb(a[i]);
  54. }else res.pb(a[i]);
  55. }
  56. if(n==x.cnt){
  57. puts("0");
  58. continue;
  59. }
  60. ll ans=1ll*(n-x.cnt)*ksm(2,n-x.cnt-1)%mod;
  61. for(ll val:res){
  62. y.insert(val);
  63. }
  64. for(ll i:q){
  65. z=y;
  66. for(ll j:q){
  67. if(i==j) continue;
  68. z.insert(j);
  69. }
  70. if(!z.insert(i)) ans=(ans+ksm(2,n-x.cnt-1))%mod;
  71. }
  72. printf("%lld\n",ans);
  73. }
  74. return 0;
  75. }

2019牛客暑期多校训练营(第一场)H 线性基+计算贡献的更多相关文章

  1. 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)

    题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...

  2. 2019牛客暑期多校训练营(第九场) D Knapsack Cryptosystem

    题目 题意: 给你n(最大36)个数,让你从这n个数里面找出来一些数,使这些数的和等于s(题目输入),用到的数输出1,没有用到的数输出0 例如:3  4 2 3 4 输出:0 0 1 题解: 认真想一 ...

  3. [题解] 2019牛客暑期多校第三场H题 Magic Line

    题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意:二维平面上有n个不同的点,构造一条直线把平面分成两个点数相同的部分. 题解:对这n个点以x为第一关键 ...

  4. 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题)

    layout: post title: 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题) author: "luowentaoaa" c ...

  5. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...

  6. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  7. 2019牛客暑期多校训练营(第一场) B Integration (数学)

    链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...

  8. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  9. 2019牛客暑期多校训练营(第一场) - H - XOR - 线性基

    https://ac.nowcoder.com/acm/contest/881/H 题意: 给定n个整数,求其中异或和为 \(0\) 的子集的大小的和. 题解思路: 首先转化为每个可以通过异或表示 \ ...

  10. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

随机推荐

  1. vue使用axios进行ajax请求

    以前都用resource进行ajax请求,现在官方推荐使用axios,所以现在更换插件.这篇文章主要描写如何在项目中引入axios以及简单地使用axios进行ajax请求. 第一步,需要通过npm安装 ...

  2. Codeforces 1236B. Alice and the List of Presents

    传送门 显然每种礼物是互相独立的,一个礼物的分配不会影响另一个礼物 对于某个礼物 $x$ , 对于每个盒子来说,要么选要么不选,那么可以看成长度为 $m$ 的二进制序列 这个序列第 $i$ 位的数就代 ...

  3. Java IO与NIO的总结、比较

    一.IO流总结 1.Java I/O主要包括如下3层次: 流式部分——最主要的部分.如:OutputStream.InputStream.Writer.Reader等 非流式部分——如:File类.R ...

  4. Java 多线程创建和线程状态

    一.进程和线程 多任务操作系统中,每个运行的任务是操作系统运行的独立程序. 为什么引进进程的概念? 为了使得程序能并发执行,并对并发执行的程序加以描述和控制. 因为通常的程序不能并发执行,为使程序(含 ...

  5. C#发送Outlook邮件(仅SMTP版本)

    先表明Outlook的参数:网址:https://support.office.com/zh-cn/article/Outlook-com-%E7%9A%84-POP%E3%80%81IMAP-%E5 ...

  6. MFC六大核心机制

    MFC六大核心机制概述 我们选择了C++,主要是因为它够艺术.够自由,使用它我们可以实现各种想法,而MFC将多种可灵活使用的功能封装起来,我们岂能忍受这种“黑盒”操作?于是研究分析MFC的核心机制成为 ...

  7. python 使用pymssql连接sql server数据库(转)

    import pymssql class MSSQL:    """    对pymssql的简单封装    pymssql库,该库到这里下载:http://www.lf ...

  8. HTML5之动画优化(requestAnimationFrame)

    定时器setInterval实现的匀速动画为什么不是匀速? window.requestAnimationFrame() 一.定时器setInterval实现的匀速动画为什么不是匀速? 以上提问并非通 ...

  9. webpack配置不同打包配置

    生成环境与开发环境打包配置 使用package.json配置npm run开启不同的打包配置 ...webpack基本使用最后一篇博客 在上一篇博客中详细的演示了webpack开启本地服务和热更新,这 ...

  10. ui组件库

    基于Vue的Quasar Framework 中文网 http://www.quasarchs.com/ quasarframework/quasar: Quasar Frameworkhttps:/ ...