【2019牛客暑期多校训练营(第一场) - H】XOR(线性基,期望的线性性)

题干:

链接:https://ac.nowcoder.com/acm/contest/881/H
来源:牛客网
 

Bobo has a set A of n integers a1,a2,…,ana1,a2,…,an.
He wants to know the sum of sizes for all subsets of A whose xor sum is zero modulo (109+7)(109+7).
Formally, find (∑S⊆A,⊕x∈Sx=0|S|)mod(109+7)(∑S⊆A,⊕x∈Sx=0|S|)mod(109+7). Note that ⊕⊕ denotes the exclusive-or (XOR).

输入描述:

The input consists of several test cases and is terminated by end-of-file.The first line of each test case contains an integer n.
The second line contains n integers a1,a2,…,ana1,a2,…,an.* 1≤n≤1051≤n≤105
* 0≤ai≤10180≤ai≤1018
* The number of test cases does not exceed 100.
* The sum of n does not exceed 2×1062×106.

输出描述:

For each test case, print an integer which denotes the result.

示例1

输入

复制

1
0
3
1 2 3
2
1000000000000000000 1000000000000000000

输出

复制

1
3
2

题目大意:

给你n个数字,然后让你求所有满足 异或和为0的子集 的大小之和。

解题报告:

根据期望的线性性(Orz),转化一下题意:相当于求每个数出现在子集中的次数之和。

那么如何求每个的合法出现次数呢?对于每个数x的出现次数,也就是这个数x必选的情况下,有多少种选择方案可以让剩余n-1个数凑出x来。然后就可以x\oplus x=0

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

1.线性基外:共n-r个数,枚举每个数,让他必选,将线性基外剩余的n-r-1个数任意排列(也可不选),则共有 2^{n-r-1}种方案,每种方案再异或x的结果,能被刚刚求出的那组线性基唯一的异或出来,所以每个数的贡献为:1\times2^{n-r-1} = 2^{n-r-1}。又因为一共有n-r个数,所以线性基外的数的贡献为:(n-r)\times2^{n-r-1}

2.线性基内:依旧是枚举每个数x(注意枚举的x是a数组中的数而不是b1中的数),求出剩余n-1个数凑出x的方案数,做法是这样的:将所有剩余的n-1个数再求一次线性基,设为b2,分两种情况:

(1) x不能被b2异或出。那么显然x不能在任意一个集合中出现,x的贡献为0。

(2) x可以被b2异或出。此时b2的大小必定也为r,因为b2已经能表示所有n个数了。那么在除去x和b2的情况下,剩余n-r-1个数显然也是任意排列,x贡献为 2^{n-r-1}

对于在线性基内的方案统计时,还有另一种理解:因为这个数x在线性基内,也就是说他代表了二进制中的一个Bit位在线性基中的存在,那么我们要凑出这个x的话(注意x依旧是原数,而不是线性基内的数字),就必须要找一个可以代表这个Bit位的数字来替代他,也就是:用除去x的剩余n-1个数,重构一组线性基后,如果基的大小仍为b1.r,则说明x在原基b1中不是必须的,可以被替代,此时也才说明x对答案做出了贡献,不然的话只有x能代表这个Bit,那他代表给谁看?和谁去异或成0?所以对答案没有任何贡献。所以写代码最后一部分的时候,既可以这样写:if(b3.r == b1.r) 也可以这样写:if(b3.ins(a[i])==0)也就是说如果插不进去a[i]了,就代表他对答案做出了贡献,因为新基可以凑出所有数字。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define F first
#define S second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e5 + 5;
const ll mod = 1e9 + 7;
int n,top;
ll a[MAX],ans,tmp,b[MAX];
struct Node {ll Base[66];int r;void init() {memset(Base,0,sizeof Base);r=0;}bool ins(ll x) {for(int i = 62; i>=0; i--) {if(x & (1LL<<i)) {if(Base[i] == 0) {Base[i] = x;r++;return 1;}else x ^= Base[i];}if(x == 0) return 0;}return 0;}
} b1,b2,b3;
ll qpow(ll a,ll k) {ll res = 1;while(k) {if(k&1) {res = (res * a) % mod;}k>>=1;a = (a * a)%mod;}return res;
}
int main()
{while(~scanf("%d",&n)) {ans = tmp = 0;b1.init();b2.init();top=0;for(int i = 1; i<=n; i++) scanf("%lld",a+i);for(int i = 1; i<=n; i++) {if(b1.ins(a[i])) b[++top] = a[i];else b2.ins(a[i]);}if(n == b1.r) {printf("0\n");continue;}ans = (n-b1.r) * qpow(2,n - b1.r - 1);for(int i = 1; i<=top; i++) {b3 = b2;for(int j = 1; j<=top; j++) {if(i == j) continue;b3.ins(b[j]);}if(b3.r == b1.r) tmp++;}ans = ans + tmp*qpow(2,n - b1.r - 1);printf("%lld\n",ans%mod);}  return 0 ;
}

AC代码2:(咖啡鸡的代码,也不知道是维护了个啥)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+3;
const ll M=1000000007;
ll v;
struct base{ll r[64],o[64];bool ins(ll x){bool flag=0;ll tmp=0;for (int i=62;i>=0;i--)if (x>>i){if (!r[i]) o[i]=tmp|(1ll<<i),r[i]=x,flag=1;x^=r[i]; tmp^=o[i];if (!x) break;}if (!flag){v|=tmp;}return flag;}void clear(){for (int i=0;i<64;i++) r[i]=0,o[i]=0;}
}f;
ll pow_(ll x,ll y){ll ret=1;while (y){if (y&1) ret=ret*x%M;x=x*x%M; y>>=1;}return ret;
}
int n,w;
ll a[maxn],ans;int main(){while (scanf("%d",&n)==1){for (int i=1;i<=n;i++) scanf("%lld",&a[i]);for (int i=0;i<64;i++) v=0; f.clear(); ans=w=0;for (int i=1;i<=n;i++){ans+=!f.ins(a[i]);}for (int i=0;i<64;i++) {if (v&(1ll<<i)) ++ans;if (f.r[i]) ++w;}cout << ans*pow_(2ll,n-1-w)%M << endl;}return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习入门必备的13张“小抄”(附下载)

目录 1&#xff09;TensorFlow 2&#xff09;Keras 3&#xff09;Neural Networks 4&#xff09;Numpy 5&#xff09;Scipy 6&#xff09;Pandas 7&#xff09;Scikit-learn 8&#xff09;Matplotlib 9&#xff09;PythonForDataScience 最近在github上发现了很有用的…

吴恩达机器学习作业(1):线性回归

目录 1&#xff09;导入相关库和数据 2&#xff09;代价函数 3&#xff09;批量梯度下降 4&#xff09;绘制线性模型 前阵子在网易云课堂学习了吴恩达老师的机器学习课程&#xff0c;今天结合网上资料&#xff0c;用Python实现了线性回归作业&#xff0c;共勉。建议大家使…

ROS导航之参数配置和自适应蒙特卡罗定位

我们的机器人使用两种导航算法在地图中移动&#xff1a;全局导航&#xff08;global&#xff09;和局部导航&#xff08;local)。这些导航算法通过代价地图来处理地图中的各种信息&#xff0c;导航stack使用两种costmaps http://www.cnblogs.com/zjiaxing/p/5543386.html存储环…

吴恩达机器学习作业(2):多元线性回归

目录 1&#xff09;数据处理 2&#xff09;代价函数 3&#xff09;Scikit-learn训练数据集 4&#xff09;正规方程 练习1还包括一个房屋价格数据集&#xff0c;其中有2个变量&#xff08;房子的大小&#xff0c;卧室的数量&#xff09;和目标&#xff08;房子的价格&#…

机器学习笔记(八):神经网络:学习

目录 1&#xff09;Cost function 2&#xff09;Backpropagation algorithm 3&#xff09;Backpropagation intuition 4) Gradient checking 5&#xff09;Random initialization 6&#xff09;Putting it together 注&#xff1a;吴恩达老师的机器学习课程对反向传播算…

吴恩达机器学习作业(3):逻辑回归

目录 1&#xff09;数据处理 2&#xff09;sigmoid函数 3&#xff09;代价函数 4&#xff09;梯度下降 5&#xff09;预测函数 我们首先做一个练习&#xff0c;问题是这样的&#xff1a;设想你是大学相关部分的管理者&#xff0c;想通过申请学生两次测试的评分&#xff0c…

机器学习笔记(九):应用机器学习的建议

目录 1&#xff09;Deciding what to try next 2&#xff09;Evaluating a hypothesis 3&#xff09;Model selection and training/validation/test sets 4&#xff09;Diagnosing bias vs. variance 5&#xff09;Regularization and bias/variance 6&#xff09;Learn…

【洛谷 - P1231 】教辅的组成(网络流最大流,拆点)

题干&#xff1a; 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案&#xff0c;然而他却明明记得这书应该还包含一份练习题。然而出现在他眼前的书多得数不胜数&#xff0c;其中有书&#xff0c;有答案&#xff0c;有练习册。已知一个完整的书册均应该包含且仅包含一本书…

机器学习笔记(十):机器学习系统的设计

目录 1&#xff09;Prioritizing what to work on:Spam classification example 2&#xff09;Error analysis 3&#xff09;Error metrics for skewed classes 4&#xff09;Trading off precision and recall 5&#xff09;Data for machine learning 下面将学习到在构建…

【洛谷 - P1345 [USACO5.4]】奶牛的电信(网络流最小割,拆点)

题干&#xff1a; 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系&#xff0c;于是她们建立了一个奶牛电脑网络&#xff0c;以便互相交流。这些机器用如下的方式发送电邮&#xff1a;如果存在一个由c台电脑组成的序列a1,a2,...,a(c)&#xff0c;且a1与a2相连&#xff0c;a2与…

机器学习笔记(十一):支持向量机

目录 1&#xff09;Optimization objective 2&#xff09;Large Margin Intuition 3&#xff09;Kernels 1 4&#xff09;Kernels II 5&#xff09;Using an SVM 注&#xff1a;这一章SVM可能有点难理解&#xff0c;强烈建议大家把本章的编程作业做了。 1&#xff09;Opt…

ros中的坐标系,

ros中的坐标系&#xff0c;主要包括&#xff1a; map&#xff0c;odom&#xff0c;base_link(base_footprint) 以及如laser&#xff0c;camera等传感器的坐标系&#xff1b; 这些坐标系间的关系可以用下图表示&#xff1a; 这是一个有向图&#xff0c;图中涉及四个坐标系&#…

【Gym - 101061F】Fairness(dp,思维)

题干&#xff1a; Dwik and his brother Samir both received scholarships from a famous university in India. Their father, Besher, wants to send some money with each of them. Besher has n coins, the ith coin has a value of ai. He will distribute these coins…

(2)连续存储数组的方法

目录 连续存储的代表应用&#xff1a;数组 1&#xff09;结构体的定义&#xff1a; 2&#xff09;基本操作 对数据进行初始化 判断数组是否为空 输出数组 判断数组是否满 追加元素 插入数组元素 删除数组元素 逆序 对数组进行排序 这篇笔记是根据郝斌老师的上课讲义…

什么是欧拉角/姿态角?

用一句话说&#xff0c;欧拉角就是物体绕坐标系三个坐标轴(x,y,z轴&#xff09;的旋转角度。 在这里&#xff0c;坐标系可以是世界坐标系&#xff0c;也可以是物体坐标系&#xff0c;旋转顺序也是任意的&#xff0c;可以是xyz,xzy,yxz,zxy,yzx,zyx中的任何一种&#xff0c;甚至…

机器学习笔记(十二):聚类

目录 1&#xff09;Unsupervised learning introduction 2&#xff09;K-means algorithm 3&#xff09;Optimization objective 4&#xff09;Random initialization 5&#xff09;Choosing the number of clusters 1&#xff09;Unsupervised learning introduction 下…

Linux下root登陆mysql

错误如下&#xff1a; 1.停止mysql服务 #service mysql stop2.进入到skip-grant-tables模式&#xff1a; #mysqld_safe --skip-grant-tables3.root连接mysql数据库&#xff1a; #mysql -uroot -p如出现如下错误&#xff1a; 其实&#xff0c;原本就没有这个目录&#xff1…

机器学习笔记(十三):降维

目录 1&#xff09;Motivation 1:Data Compression 2&#xff09;Motivation 2: Data Visualization 3&#xff09;Principal Component Analysis problem formulation 4&#xff09;Principal Component Analysis algorithm 5&#xff09;Advice for applying PCA 1&…

Django框架(展示图书信息简易版)

Linux环境下 创建虚拟环境 在python3中&#xff0c;创建虚拟环境 mkvirtualenv -p python3 虚拟机名称 mkvirtualenv -p python3 py_django查看创建的虚拟环境 workon退出当前的虚拟环境 deactivate 删除虚拟环境&#xff08;不要做&#xff09; rmvirtualenv 虚拟机名称 …

吴恩达机器学习作业(五):支持向量机

目录 1&#xff09;数据预处理 2&#xff09;Scikit-learn支持向量机 3&#xff09;决策边界比较 4&#xff09;非线性SVM 5&#xff09;最优超参数 6&#xff09;垃圾邮件过滤器 在本练习中&#xff0c;我们将使用支持向量机&#xff08;SVM&#xff09;来构建垃圾邮件分…