1. /*
  2. 给定数组a[],求有多少集合的异或值为0,将这些集合的大小之和求出来
  3. 对于每个数来说,如果除去这个数后数组里做出的线性基和这个数线性相关,那么这个数贡献就是2^(n-1-线性基的大小)
  4. 反之这个数和线性基线性无关,即数组里凑不出这个数来和其异或等于0,所以贡献就是0
  5. 由于做n次线性基很麻烦,所以简化问题,只需要先做出一个基,将数分成在基内和基外即可
  6. 首先做出一个线性基base,设其大小为r
  7. 然后分情况来讨论:
  8. 1.对于线性基外的每个数,其贡献是2^(n-r-1)
  9. 2.对于每个线性基内的数字ai,做一个除去ai的线性基base'
  10. 如果base'和ai线性相关,那么ai的贡献就是2^(n-r-1),
  11. 反之ai和base'线性无关,贡献是0
  12. */
  13. #include<bits/stdc++.h>
  14. using namespace std;
  15. #define ll long long
  16. #define maxn 100005
  17. #define mod 1000000007
  18. struct LB{
  19. ll b[],r;
  20. void clear(){for(int i=;i>=;i--)b[i]=;r=;}
  21. void insert(ll x){
  22. for(int i=;i>=;i--)if(x>>i & ){
  23. if(!b[i]){
  24. b[i]=x;r++;break;
  25. }
  26. x^=b[i];
  27. }
  28. }
  29. int check(ll x){
  30. for(int i=;i>=;i--)if(x>>i & ){
  31. if(!b[i])return ;
  32. x^=b[i];
  33. }
  34. return ;
  35. }
  36. }base,tmp,tmp2;
  37. ll n,a[maxn],flag[maxn],flag2[maxn];
  38.  
  39. ll Pow(ll a,ll b){
  40. ll res=;
  41. while(b){
  42. if(b%)res=res*a%mod;
  43. b>>=;a=a*a%mod;
  44. }
  45. return res;
  46. }
  47.  
  48. int main(){
  49. while(scanf("%lld",&n)!=EOF){
  50. ll ans=;
  51. memset(flag,,sizeof flag);
  52. base.clear();tmp.clear();
  53. for(int i=;i<=n;i++)scanf("%lld",&a[i]);
  54. for(int i=;i<=n;i++)
  55. if(base.check(a[i])){
  56. base.insert(a[i]);
  57. flag[i]=;
  58. }
  59. //在base之外再做一个线性基
  60. for(int i=;i<=n;i++)
  61. if(!flag[i])tmp.insert(a[i]);
  62.  
  63. ll P=Pow(,n-base.r-);
  64.  
  65. for(int i=;i<=n;i++)
  66. if(!flag[i])//在线性基base外
  67. ans=(ans+P)%mod;
  68. else {//在线性基内
  69. tmp2=tmp;
  70. for(int j=;j<=n;j++)
  71. if(flag[j]&&j!=i)tmp2.insert(a[j]);
  72. if(tmp2.check(a[i])==)
  73. ans=(ans+P)%mod;
  74. }
  75. cout<<ans<<endl;
  76. }
  77. }

线性基算贡献——19牛客多校第一场H的更多相关文章

  1. 2019年牛客多校第一场 H题XOR 线性基

    题目链接 传送门 题意 求\(n\)个数中子集内所有数异或为\(0\)的子集大小之和. 思路 对于子集大小我们不好维护,因此我们可以转换思路变成求每个数的贡献. 首先我们将所有数的线性基的基底\(b\ ...

  2. 2019牛客多校第一场H XOR 线性基模板

    H XOR 题意 给出一组数,求所有满足异或和为0的子集的长度和 分析 n为1e5,所以枚举子集肯定是不可行的,这种时候我们通常要转化成求每一个数的贡献,对于一组数异或和为0.我们考虑使用线性基,对这 ...

  3. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

  4. 牛客多校第一场 B Inergratiion

    牛客多校第一场 B Inergratiion 传送门:https://ac.nowcoder.com/acm/contest/881/B 题意: 给你一个 [求值为多少 题解: 根据线代的知识 我们可 ...

  5. 2019年牛客多校第一场B题Integration 数学

    2019年牛客多校第一场B题 Integration 题意 给出一个公式,求值 思路 明显的化简公式题,公式是分母连乘形式,这个时候要想到拆分,那如何拆分母呢,自然是裂项,此时有很多项裂项,我们不妨从 ...

  6. 【2019牛客多校第一场】XOR

    题意: 给你一个集合A,里边有n个正整数,对于所有A的.满足集合内元素异或和为0的子集S,问你∑|S| n<=1e5,元素<=1e18 首先可以转化问题,不求∑|S|,而是求每个元素属于子 ...

  7. 2019牛客多校第一场E ABBA(DP)题解

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

  8. 2019 牛客多校第一场 D Parity of Tuples

    题目链接:https://ac.nowcoder.com/acm/contest/881/D 看此博客之前请先参阅吕凯飞的论文<集合幂级数的性质与应用及其快速算法>,论文中很多符号会被本文 ...

  9. Cutting Bamboos(2019年牛客多校第九场H题+二分+主席树)

    题目链接 传送门 题意 有\(n\)棵竹子,然后有\(q\)次操作,每次操作给你\(l,r,x,y\),表示对\([l,r]\)区间的竹子砍\(y\)次,每次砍伐的长度和相等(自己定砍伐的高度\(le ...

随机推荐

  1. 有穷自动机(NFA、DFA)&正规文法&正规式之间的相互转化构造方法

    在编译原理(第三版清华大学出版社出版)中第三章的词法分析中,3.4.3.5.3.6小节中分别讲解了 1.什么是NFA(不确定的有穷自动机)和DFA(确定的有穷自动机) 2.如何将  不确定的有穷自动机 ...

  2. 浅谈无线h5开发

    最近一直在做h5的项目,对h5开发有了自己的理解.首先h5开发并不是指的html5的开发,而是指无线端的web开发,至于为什么叫h5开发,我觉得一方面是因为html5近几年还是挺受关注,另一方面h5在 ...

  3. ToDoList 增删改查

    ToDoList 主要功能 增加数据 删除数据 修改数据 查寻数据渲染页面 1 . HTML页面 <!DOCTYPE html> <html lang="en"& ...

  4. 云原生数据库崛起,阿里云POLARDB当选世界互联网领先科技成果!

    第六届世界互联网大会来了!千年水乡古镇乌镇又一次吸引了全世界的目光. 刚刚,阿里云自研数据库POLARDB在会上当选世界互联网领先科技成果.POLARDB解决了企业在云时代的数据库难题,帮助企业在数小 ...

  5. Yii2中应用子模块下的内容

    public function actionIndex(){ $article=\YII::$app->getModule('article'); $article->runAction( ...

  6. flutter 使用keyboard_actions 关闭ios键盘

    项目中登录 输入账号密码 弹出的键盘 关闭不了,从而 引来一些问题, 1,第一次关闭 项目是在 最外层包裹一层,点击的时候进行关闭, return Scaffold( resizeToAvoidBot ...

  7. mongdb 备份还原导入导出

    -------------------MongoDB数据导入与导出------------------- 1.导出工具:mongoexport     1.概念:         mongoDB中的m ...

  8. tornado的安装

      centos6.4 安装tornado框架连接工具  xshell 工具 1.如果在windows下有tornado的安装包首先现在上装到linux下的上传工具:yum install lrzsz ...

  9. FVWM_SMALLEST_CONFIG

    ... # ----------------------------------------------------------------- # HANDBOOK: # http://yaoqian ...

  10. error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”?

    解决方案: 属性>预编译头>不使用预编译头>应用