题意:给定数组,求所有异或起来为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 ;
}

最新文章

  1. Python-06-面向对象(基础篇)
  2. [Leetcode] Course Schedule
  3. Struts和SpringMVC两种MVC框架比较
  4. thinkPHP实现瀑布流的方法
  5. HUD 2203 亲和串
  6. Oracle数据库高级查询(五)集合查询
  7. UVa 497 - Strategic Defense Initiative
  8. [core java学习笔记][第四章对象与类]
  9. Oracle:ORA-01791: 不是 SELECTed 表达式
  10. Go成功的项目
  11. C#技术点--修改系统时间
  12. 蓝桥杯 全球变暖(dfs)
  13. elementUI vue v-model的修饰符
  14. MOD(motion Object Detection)介绍
  15. zookeeper 集群部署
  16. Linux ugo 权限
  17. 20165336 2017-2018-2 《Java程序设计》第4周学习总结
  18. 【原创】&lt;笔试题&gt; 深圳市天软科技开发有限公司
  19. echarts柱形图x轴显示不全或者每隔一个不显示的问题
  20. win32.gui.api.con(前置,鼠标点击,发送数据的Dome)

热门文章

  1. .NET 微服务 学习目录
  2. SCIE和SCI
  3. 在Apache中安装php5.6 &amp; php7.3
  4. Codeforces 878 E. Numbers on the blackboard
  5. SQL分类之DQL:查询表中的记录
  6. Replication:The transaction log for database &#39;tempdb&#39; is full due to &#39;ACTIVE_TRANSACTION&#39;
  7. ER图VISIO 引入Mysql 反向工程
  8. NETCore使用带有权限验证的Swagger
  9. phpstorm 2016.3.2 的最新破解方法
  10. 使用SqlBulkCopy将DataTable百万级数据瞬间入库