2019牛客多校第一场H XOR 线性基模板
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 线性基模板的更多相关文章
- 2019 牛客暑期多校 第一场 H XOR (线性基)
题目:https://ac.nowcoder.com/acm/contest/881/H 题意:求一个集合内所有子集异或和为0的长度之和 思路:首先集合内异或和,这是线性基的一个明显标志,然后我们不管 ...
- 【2019牛客多校第一场】XOR
题意: 给你一个集合A,里边有n个正整数,对于所有A的.满足集合内元素异或和为0的子集S,问你∑|S| n<=1e5,元素<=1e18 首先可以转化问题,不求∑|S|,而是求每个元素属于子 ...
- 2019牛客多校第一场 I Points Division(动态规划+线段树)
2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...
- 2019年牛客多校第一场 H题XOR 线性基
题目链接 传送门 题意 求\(n\)个数中子集内所有数异或为\(0\)的子集大小之和. 思路 对于子集大小我们不好维护,因此我们可以转换思路变成求每个数的贡献. 首先我们将所有数的线性基的基底\(b\ ...
- 2019牛客多校第一场E ABBA(DP)题解
链接:https://ac.nowcoder.com/acm/contest/881/E 来源:牛客网 ABBA 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语 ...
- 线性基算贡献——19牛客多校第一场H
/* 给定数组a[],求有多少集合的异或值为0,将这些集合的大小之和求出来 对于每个数来说,如果除去这个数后数组里做出的线性基和这个数线性相关,那么这个数贡献就是2^(n-1-线性基的大小) 反之这个 ...
- 2019杭电多校第一场hdu6579 Operation(线性基)
Operation 题目传送门 解题思路 把右边的数尽量往高位放,构造线性基的时候同时记录其在原序列中的位置,在可以插入的时候如果那个位置上存在的数字的位置比新放入的要小,就把旧的往后挤.用这种发现构 ...
- 2019牛客多校第一场A-Equivalent Prefixes
Equivalent Prefixes 传送门 解题思路 先用单调栈求出两个序列中每一个数左边第一个小于自己的数的下标, 存入a[], b[].然后按照1~n的顺序循环,比较 a[i]和b[i]是否相 ...
- 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 ...
随机推荐
- codewars--js--Happy numbers++无穷大判断
问题描述: A happy number is a number defined by the following process: starting with any positive intege ...
- linux中目录处理命令
目录 mkdir cd pwd rmdir cp mv rm mkdir 解释 命令名称:mkdir 命令英文原意:make directories 命令所在路径:/bin/mkdir 执行权限:所有 ...
- 彻底理解Windows认证1
彻底理解Windows认证 一.Windows本地认证 1. 我的密码在哪里? 路径:C:\Windows\System32\config\SAM 当我们登录系统的时候,系统会自动的读取SAM文件中的 ...
- Mac 下如何判断 WIFI 的极限传输速度还有信号强度?
每当你加入一个无线网络后,按住Option键并点击屏幕右上角的Wi-Fi图标,就会发现除了平常的各种网络外,还出现了关于网络连接技术细节的列表. 比如说,如果想知道信号强度的信息,则需要尤其关注列表中 ...
- (未完成)【Android】MVP模式初见(一)
最近在阅读郭霖大神的公众号时,分类中架构引起了我的注意. 虽然是个人开发(水平很菜的那种),但最终都要向企业正式项目开发靠近.因此接下来一段时间,主要学习一下MVP架构.Retrofit以及RxJav ...
- Vue中data元素之间相互赋值的陷阱
今天在整理代码时,遇到这样的一个场景,下面将结合示例说明: (一)在Vue文件中定义一个const常量,如下图所示: (二)在data中有三个元素是这样赋值的,如下图所示: (三)在created() ...
- phpcms搜索给分页代码添加参数方法
在使用PHPCMS开发网站时遇到了一个搜索功能,需要在搜索结果分页链接上添加一些传递的参数,不然不能够正确翻页. 方法: 找到\phpcms\libs\functions\global.func.ph ...
- JN_0015:ping IP 地址
1,打开命令窗口 2,ping www.baidu.com
- 字符串相等 impossible 1480
题目描述 两个长度不超过80的字符串,串中包括大写.小写和空格字符,去掉空格并忽略大小写后,判断两个字符串是否相等. 输入描述 第1行输入是测试数据的组数n,每组测试数据占两行,第1行是第一个字符串s ...
- SpringBoot整合持久层技术--(三)Spring Data JPA
简介: JPA(java Persistence API)和SpringData是两个范畴的概念.spring data jpa是spring公司下的spring data项目的一个模块. sprin ...