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. springboot 后台框架平台 mybatis 集成代码生成器 shiro 权限 websocket

    1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2. ...

  2. 开源工作流管理系统节点接收人设置“指定节点处理人”系列讲解

    关键字: 驰骋工作流程快速开发平台 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 开发者表单  拖拽式表单 工作流系统CCBPM节点访问规则接收人规则 适配数据库: o ...

  3. Centos7没有IP地址,查看网络状态显示No suitable device found for this connection (devint match))

    今天打开虚拟机,使用 ifconfig 命令时,没有显示出 IP 地址 (更好的阅读体验可访问 这里 ) 使用 systemctl status network 命令查看网络状态 显示没有合适的网络装 ...

  4. 仁和药业顺利出局,布局地产万科A

    仁和药业布局到第二单,被止盈了,盈利大约1.1%.这几日地产行业回调明显,所以布局了万科A. 资金量W11.8 建仓价格28.6 加仓系数1.5 加仓间隔2.70% 总盈利比6.50% 期待吧!

  5. C# 调用WCF服务的两种方法

    项目简介 之前领导布置一个做单点登录的功能给我,实际上就是医院想做一个统一的平台来实现在这个统一的平台登录后不需要在His.Emr.Lis等系统一个个登录,直接可以登录到对应的系统,然后进行相应的操作 ...

  6. jmeter导入jmx文件报错:missing class com.thoughtworks.xstream.converters.ConversionException

    有的时候我们会参考别人的jmx文件,但是在导入的时候会报错如下图: 实际上是告诉我们缺少jar包所引起的,下载对应jar包放到jmeter安装目录对应的lib/ext下就可以了,如下图: jmeter ...

  7. stlink 下载报错:Error Flash Download failed - "Cortext-M0+"

    stlink 下载报错:Error Flash Download failed - "Cortext-M0+" 解决方法: STM32 ST-LINK Utility 用这个软件把 ...

  8. day 17 初始递归

    递归函数 了解什么是递归 : 在函数中调用自身函数 最大递归深度默认是997/998 —— 是python从内存角度出发做的限制 能看懂递归 能知道递归的应用场景 初识递归 —— 算法 —— 二分查找 ...

  9. C语言再学习part3—算法

    君子远庖厨,万物皆备于我.—孟子 这篇文章主要总结程序的主要要素,以及程序的构成是什么样子的.最后说说我学到的一种奇特的表示算法的方式—伪代码. 让我们开始吧! 一个程序应该包括以下两个主要要素: 1 ...

  10. 两种从 TensorFlow 的 checkpoint生成 frozenpb 的方法

    1. 从 ckpt-.data,ckpt-.index 和 .meta 生成 frozenpb import os import tensorflow as tf from tensorflow.py ...