2019牛客暑期多校训练营(第一场):XOR(线性基)
2024-10-20 08:52:23
题意:给定数组,求所有异或起来为0的集和的大小之和。
思路:由于是集合大小,我们换成考虑每个元素在多少个集合里有贡献。 先生成线性基。
对于没有插入线性基的元素x,贡献是2^(N-base-1),因为x选择之后,其他非基元素无论选还是不选,都可以调整基来使得异或和为0。
对于插入线性基的元素x,我们也同样这样考虑,把除了它的N-1个数生成线性基。 就可以同样算贡献了。 这里现在可以稍加优化,把最开始的非基元素预处理成一个线性基,这样生成新的线性基就快起来了。
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep2(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=;
const int Mod=1e9+;
ll a[maxn],b[maxn],c[maxn],used[maxn]; int tot;
int qpow(int a,int x){
int res=; while(x){
if(x&) res=1LL*res*a%Mod;
x>>=; a=1LL*a*a%Mod;
} return res;
}
bool add(ll x,ll base[])
{
rep2(i,,) {
if(x&(1LL<<i)){
if(!base[i]){ base[i]=x; return true;}
x^=base[i];
}
}
return false;
}
int main()
{
int N,ans=; ll x;
while(~scanf("%d",&N)){
rep(i,,) a[i]=b[i]=c[i]=; tot=;
rep(i,,N) {
scanf("%lld",&x);
if(add(x,a)) used[++tot]=x;
else add(x,b);
}
if(tot<N) ans=1LL*qpow(,N-tot-)*(N-tot)%Mod;
rep(i,,tot){
rep(j,,) c[j]=b[j];
rep(j,,tot) if(i!=j) add(used[j],c);
if(!add(used[i],c)) (ans+=qpow(,N-tot-))%=Mod;
}
printf("%d\n",ans);
}
return ;
}
最新文章
- Python-06-面向对象(基础篇)
- [Leetcode] Course Schedule
- Struts和SpringMVC两种MVC框架比较
- thinkPHP实现瀑布流的方法
- HUD 2203 亲和串
- Oracle数据库高级查询(五)集合查询
- UVa 497 - Strategic Defense Initiative
- [core java学习笔记][第四章对象与类]
- Oracle:ORA-01791: 不是 SELECTed 表达式
- Go成功的项目
- C#技术点--修改系统时间
- 蓝桥杯 全球变暖(dfs)
- elementUI vue v-model的修饰符
- MOD(motion Object Detection)介绍
- zookeeper 集群部署
- Linux ugo 权限
- 20165336 2017-2018-2 《Java程序设计》第4周学习总结
- 【原创】<;笔试题>; 深圳市天软科技开发有限公司
- echarts柱形图x轴显示不全或者每隔一个不显示的问题
- win32.gui.api.con(前置,鼠标点击,发送数据的Dome)
热门文章
- .NET 微服务 学习目录
- SCIE和SCI
- 在Apache中安装php5.6 &; php7.3
- Codeforces 878 E. Numbers on the blackboard
- SQL分类之DQL:查询表中的记录
- Replication:The transaction log for database &#39;tempdb&#39; is full due to &#39;ACTIVE_TRANSACTION&#39;
- ER图VISIO 引入Mysql 反向工程
- NETCore使用带有权限验证的Swagger
- phpstorm 2016.3.2 的最新破解方法
- 使用SqlBulkCopy将DataTable百万级数据瞬间入库