H XOR

题意

给出一组数,求所有满足异或和为0的子集的长度和

分析

n为1e5,所以枚举子集肯定是不可行的,这种时候我们通常要转化成求每一个数的贡献,对于一组数异或和为0.我们考虑使用线性基,对这一组数求线性基,设基的长度为r,由线性代数的知识我们可以知道,在这个数组中取一个数,这个线性基有唯一一种组成方式使得异或这个数为0。所以对于不在线性基的每一个数,他可以组成的子集个数为\(2^{n-r-1}\),所以所有不构成线性基的数的贡献为\((n-r)*2^{n-r-1}\),那么对于在线性基里的数怎么办呢?,这就转化成了用剩下的n-1个数能不能表示出这个数,有多少种表示这个数的方式,我们可以对剩下的n-r的数再求一次基,如何才能表示出这个数呢,由线性定理只是可以知道,同一个组数的线性基可以不同,但他们秩是相同的,而要表示的这个数在一个线性基里面,所以要表示他,我们对于剩下的数,如果秩还是r,就可以表示,那么这个数就可以和n-1-r个数组成子集贡献就是\(2^{n-r-1}\),否则贡献就是0了

#include <cstdio>
#include <cmath>
#include <algorithm>
#include<vector>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
typedef long long UI;
const int maxn=1e5+9;
int vis[maxn];
UI a[maxn];
const int mod=1e9+7;
ll mul(ll a,ll b){
return a%mod*b%mod;
}
ll fpow(ll a,ll b){
ll ans=1;
while(b){
if(b&1)ans=mul(ans,a);
b>>=1;
a=mul(a,a);
}
return ans;
}
#define weishu 62
UI x[weishu+1];
struct LinearBasis{
UI basis[weishu+1];//32位
int num;
int cnt;//极大无关组大小
void clear(){ memset(basis,0,sizeof(basis)); num=0;cnt=0; }//清零
void insert(UI x){ basis[num++]=x; }//单纯存数组,没有插入线性基
bool d_insert(UI x){//直接插入线性基
bool flag=0;
for(int j=weishu;j>=0;j--)
if ((x>>j)&1) {
if (basis[j]==0) {
cnt++;
basis[j]=x;
return 1;
}
else {
x^=basis[j];
}
}
return 0;
}
void build(){//用数组里面存的数生成线性基
cnt=0;
num--;
for(int i=0;i<=num;i++) x[i]=basis[i];
memset(basis,0,sizeof(basis));
for(int i=0;i<=num;i++) {
for(int j=weishu;j>=0;j--)
if ((x[i]>>j)&1) {
if (basis[j]==0) {
cnt++;
basis[j]=x[i];
break;
}
else {
x[i]^=basis[j];
}
}
}
num=0;
}
int check(UI x){//判断一个数在不在线性基中
for(int i=weishu;i>=0;i--)
if ((x>>i)&1) {
if (basis[i]==0) break;
else x^=basis[i];
}
return (x==0);
}
}bs,bs2;
vector<int>v;
int main(){
int n;
while(scanf("%d",&n)==1){
v.clear();
bs.clear(),bs2.clear();
for(int i=1;i<=n;i++){
vis[i]=0;
scanf("%lld",&a[i]);
}
for(int i=1;i<=n;i++){
if(bs.d_insert(a[i])){
v.push_back(i);
vis[i]=1;
}
}
ll r=bs.cnt;
ll ans=mul(n-bs.cnt,fpow(2,n-bs.cnt-1));
for(int i=1;i<=n;i++){
if(vis[i]==0){
bs2.d_insert(a[i]);
}
}
for(int i=0;i<v.size();i++){
bs=bs2;
for(int j=0;j<v.size();j++){
if(i!=j){
bs.d_insert(a[v[j]]);
}
}
if(bs.cnt==r)ans+=fpow(2,n-1-r);
}
ans%=mod;
printf("%lld\n",ans); }
return 0;
}

2019牛客多校第一场H XOR 线性基模板的更多相关文章

  1. 2019 牛客暑期多校 第一场 H XOR (线性基)

    题目:https://ac.nowcoder.com/acm/contest/881/H 题意:求一个集合内所有子集异或和为0的长度之和 思路:首先集合内异或和,这是线性基的一个明显标志,然后我们不管 ...

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

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

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

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

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

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

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

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

  6. 线性基算贡献——19牛客多校第一场H

    /* 给定数组a[],求有多少集合的异或值为0,将这些集合的大小之和求出来 对于每个数来说,如果除去这个数后数组里做出的线性基和这个数线性相关,那么这个数贡献就是2^(n-1-线性基的大小) 反之这个 ...

  7. 2019杭电多校第一场hdu6579 Operation(线性基)

    Operation 题目传送门 解题思路 把右边的数尽量往高位放,构造线性基的时候同时记录其在原序列中的位置,在可以插入的时候如果那个位置上存在的数字的位置比新放入的要小,就把旧的往后挤.用这种发现构 ...

  8. 2019牛客多校第一场A-Equivalent Prefixes

    Equivalent Prefixes 传送门 解题思路 先用单调栈求出两个序列中每一个数左边第一个小于自己的数的下标, 存入a[], b[].然后按照1~n的顺序循环,比较 a[i]和b[i]是否相 ...

  9. 2019牛客多校第一场 A.Equivalent Prefixes

    题目描述 Two arrays u and v each with m distinct elements are called equivalent if and only if RMQ(u,l,r ...

随机推荐

  1. 手把手教你搭建 ELK 实时日志分析平台

    本篇文章主要是手把手教你搭建 ELK 实时日志分析平台,那么,ELK 到底是什么呢? ELK 是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch.Logstash 和 Kiban ...

  2. 如何用apply实现一个bind?

    面试题:如何用apply实现一个bind? Function.prototype._bind = function(target) { // 保留调用_bind方法的对象 let _this = th ...

  3. Cassandra 在 360 的实践与改进

    分享嘉宾:王锋 奇虎360 技术总监 文章整理:王彦 内容来源:Cassandra Meetup 出品平台:DataFunTalk 注:欢迎转载,转载请留言. 导读:2010年,Dropbox 在线云 ...

  4. opencv —— moments 矩的计算(空间矩/几何矩、中心距、归一化中心距、Hu矩)

    计算矩的目的 从一幅图像计算出来的矩集,不仅可以描述图像形状的全局特征,而且可以提供大量关于该图像不同的几何特征信息,如大小,位置.方向和形状等.这种描述能力广泛应用于各种图像处理.计算机视觉和机器人 ...

  5. Python——模块和包

    一.概念 """模块():一个python文件,以 .py 结尾,包含python对象定义和语句.模块可以定义函数.类.变量,也可包含可执行文件 导入模块: 1.impo ...

  6. 4.python流程控制语句介绍

    流程控制语句分类 1).顺序结构 2).判断结构 3).循环结构 判断结构 特点:如果 ... 否则 ... 格式一:                 ①                 if 条件表 ...

  7. Resnet——深度残差网络(二)

    基于上一篇resnet网络结构进行实战. 再来贴一下resnet的基本结构方便与代码进行对比 resnet的自定义类如下: import tensorflow as tf from tensorflo ...

  8. STT-MRAM存在的两个弊端

    随着自旋转移矩效应的发现以及材料和结构的优化,基于自旋转移矩效应的STT-MRAM器件应运而生.自从自旋转移矩效应被证实以来,一方面研究人员通过大量的努力尝试降低磁化反转的临界电流,增加热稳定性:另一 ...

  9. 处理方法返回值void

    1.默认响应效果:根据请求url寻找相应页面 1.1.配置的视图解析器 <!--配置视图解析器--> <bean id="internalResourceViewResol ...

  10. Element节点

    Element节点对象对应网页的 HTML 元素.每一个 HTML 元素,在 DOM 树上都会转化成一个Element节点对象(以下简称元素节点).元素节点的nodeType属性都是1.Element ...