关于高斯消元解决xor问题的总结
我觉得xor这东西特别神奇,最神奇的就是这个性质了 A xor B xor B=A
这样就根本不用在意重复之类的问题了
关于xor的问题大家可以去膜拜莫队的《高斯消元解XOR方程组》,里面写的很详细
我来扯两道bzoj上的例题好了
bzoj2115,求1-N最长xor路径,根据那个神奇的性质,我们先随便找一条1-n的路径作为标准路径
任意一条1-N的路径都等价于标准路径和某些环的xor
怎么找环?很简单,bfs下去,设d[x]表示1到x的一条路径xor值,如果到一条边x-->y时y已经访问过了,那么d[x] xor d[y] xor w[x,y]就是一个环
然后这个问题就转变成了求一堆数中任意数xor最大的问题,这我们是通过求线性基然后按位贪心就可以了
type node=record
po,next:longint;
num:int64;
end; var f:array[..] of int64;
d:array[..] of int64;
q,p:array[..] of int64;
a:array[..] of int64;
e:array[..] of node;
x,y,i,n,m,len,t:longint;
ans,z:int64; procedure add(x,y:longint;z:int64);
begin
inc(len);
e[len].po:=y;
e[len].num:=z;
e[len].next:=p[x];
p[x]:=len;
end; procedure bfs;
var h,r,i,x,y:longint;
begin
fillchar(d,sizeof(d),);
d[]:=;
h:=; r:=; q[]:=;
while h<=r do
begin
x:=q[h];
i:=p[x];
while i<> do
begin
y:=e[i].po;
if d[y]=- then
begin
d[y]:=d[x] xor e[i].num;
inc(r);
q[r]:=y;
end
else if d[y] xor d[x] xor e[i].num<> then //找环
begin
inc(t);
a[t]:=d[y] xor d[x] xor e[i].num;
end;
i:=e[i].next;
end;
inc(h);
end;
end; procedure gauss;
var i,j:longint;
begin
for i:= to t do
for j:= downto do
if a[i] and (int64() shl j)> then //求线性基
begin
if f[j]= then
begin
f[j]:=a[i];
break;
end
else a[i]:=a[i] xor f[j];
end; ans:=d[n];
for i:= downto do
if ans and (int64() shl i)= then ans:=ans xor f[i];
end; begin
readln(n,m);
for i:= to m do
begin
readln(x,y,z);
add(x,y,z);
add(y,x,z);
end;
bfs;
gauss;
writeln(ans);
end.
bzoj2844
一堆数xor能产生数的种类数就是2^线性基的秩
并且每个数出现的次数是一样的(求证明)
然后我们就可以做了,注意这里的线性基要用高斯消元求而不能用上题的方法
因为要计算某个数出现在第几位,必须使线性基相互xor的数的大小满足二进制位的大小关系
举个例子,比如线性基a,b,c并且a>b>c,如果取a,b xor,选取状况为110,这样选取xor的数一定要比011这样选大,我们称之为满足二进制大小关系(我自己口胡的名词)
const mo=; var a,d:array[..] of longint;
f,b:array[..] of longint;
k,p,i,j,n,ans,m,t:longint; procedure swap(var a,b:longint);
var c:longint;
begin
c:=a;
a:=b;
b:=c;
end; begin
readln(n);
for i:= to n do
read(a[i]);
d[]:=;
for i:= to n do
d[i]:=d[i-]* mod mo; readln(m);
k:=n;
for i:= to n do
begin
for j:=i+ to n do
if a[i]<a[j] then swap(a[i],a[j]);
if a[i]= then
begin
k:=i-;
break;
end;
for j:= downto do
if a[i] and ( shl j)> then
begin
b[i]:=j;
for p:= to n do
if (p<>i) and (a[p] and ( shl j)>) then
a[p]:=a[p] xor a[i];
break;
end;
end;
ans:=;
for i:= to k do
if m and ( shl b[i])> then
begin
m:=m xor a[i];
ans:=(ans+d[k-i+n-k]) mod mo;
end; writeln(ans);
end.
关于高斯消元解决xor问题的总结的更多相关文章
- 【高斯消元解xor方程】BZOJ1923-[Sdoi2010]外星千足虫
[题目大意] 有n个数或为奇数或为偶数,现在进行m次操作,每次取出部分求和,告诉你这几次操作选取的数和它们和的奇偶性.如果通过这m次操作能得到所有数的奇偶性,则输出进行到第n次时即可求出答案:否则输出 ...
- 【高斯消元解xor方程组】BZOJ2466-[中山市选2009]树
[题目大意] 给出一棵树,初始状态均为0,每反转一个节点的状态,相邻的节点(父亲或儿子)也会反转,问要使状态均为1,至少操作几次? [思路] 一场大暴雨即将来临,白昼恍如黑夜!happy! 和POJ1 ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元解XOR方程组)
http://poj.org/problem?id=1222 题意:现在有5*6的开关,1表示亮,0表示灭,按下一个开关后,它上下左右的灯泡会改变亮灭状态,要怎么按使得灯泡全部处于灭状态,输出方案,1 ...
- Light OJ 1272 Maximum Subset Sum 高斯消元 最大XOR值
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u011686226/article/details/32337735 题目来源:problem=12 ...
- HDU 4418 高斯消元解决概率期望
题目大意: 一个人在n长的路径上走到底再往回,走i步停下来的概率为Pi , 求从起点开始到自己所希望的终点所走步数的数学期望 因为每个位置都跟后m个位置的数学期望有关 E[i] = sigma((E[ ...
- 高斯消元与xor方程组
;i<=n;i++) { ;j<=n;j++) if(a[j]>a[i]) swap(a[i],a[j]); if(!a[i]) break; ;j>=;j--) ) { ;k ...
- BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基
[题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...
- BZOJ 3143 HNOI2013 游走 高斯消元 期望
这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 不过笔者在做完后发现了一些问题,在原文的后面进行了说明. 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号 ...
- BZOJ 1770: [Usaco2009 Nov]lights 燈( 高斯消元 )
高斯消元解xor方程组...暴搜自由元+最优性剪枝 -------------------------------------------------------------------------- ...
随机推荐
- 修改wamp的apache默认端口80以及www目录
修改wamp的apache默认端口80以及www目录 以修改为8088端口和D:/workphp目录为例. 修改为8088端口 左键托盘图标,在“Apache”里可以直接打开httpd.conf,查找 ...
- win8安装python环境和pip & easy_install工具
最近在学python,2.7.6的版本 首先安装python2.7 官网下载地址https://www.python.org/downloads/ 下载相应版本即可,应该是一个msi的文件,默认安装到 ...
- Python遍历路径下所有文件
开始学Python,这篇文章来自于应用需求. os.walk很方便,下面写了两个版本的函数进行遍历,分别是不使用walk和使用walk的. import sys import string impor ...
- 生成XML文件,通过实体生成XML文件
实体 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xm ...
- 在MVVMLight框架的ViewModel中实现NavigationService
网上已经有很多方法了,比如通过Messenger来实现等等.这里我只讲述一种我比较喜欢的方法,因为它很方便 首先定义一个ViewModel基类,将所有ViewModel子类继承这个基类.在基类中定义 ...
- SQLite3中自增主键
SQLite清空表并将自增列归零 SQL标准中有TRUNCATE TABLE语句,用来清空表的所有内容. 但SQLite不支持这个语句.在SQLite中直接使用 DELETE FROM TableNa ...
- Kinetic使用注意点--ellipse
new Ellipse(config) 参数: config:包含所有配置项的对象. { radius: "半径,可以用数字a.数组[a,b]或对象{x:a,y:b}来表示" } ...
- springmvc整合redis架构搭建实例
新换环境,又有新东西可以学习了,哈皮! 抽空学习之余看了一下redis,个人对Springmvc的爱是忠贞不渝,所以整理了一下Springmvc整合redis的环境搭建.分享学习. 第一步: 创建ma ...
- (转载)Cocos2dx-OpenGL ES2.0教程:初识MVP(3)
在上一篇文章中,我在介绍vertex shader的时候挖了一个坑:CC_MVPMatrix.它其实是一个uniform,每一个cocos2d-x预定义的shader都包含有这个uniform, 但是 ...
- TOPAPI 消息通知机制
接收用户订阅消息 public class UserSubMain { public static void main(String[] args ) throws ApiException { St ...