Transcript Document

XOR方程组
清华大学 莫涛
[email protected]
[email protected]
前言
2
约定

XOR的计算方式

N,M<=100000

数字为260内的非负整数

讨论某道题时,假设其之前所有例题已解决
概览一(10分钟)






证明XOR满足交换律,结合律,是自身的逆运算。
从N个数中选出两个数,使XOR和最大。
N个点的边带权的树,找一条路径使XOR和最大。
从N个数中选出若干个,使XOR和为X,给出方案或指出
不可行。
在上题的基础上,给定M个限制,每个限制是那N个数的
一个子集,要求该子集中的数恰有奇数个或偶数个被选择
从N个数中选出任意个数,使XOR和最大。



O(N*643)? O(N*642)? O((N/64)*642)?O(N*64)?
从N个数中选出任意个数,求能得到的XOR和的种数。
从N个数中选出任意个数,使它们的XOR和与X的XOR和
最大。
例一

证明XOR满足交换律,结合律,是自身的逆运
算。

XOR关于每一位的独立性。

二进制数比较大小时从高到低。
例二

从N个数中选出两个数,使XOR和最大。
解法


枚举一个数,查找最接近的数
构造二进制树






[0 0 0 0] [1 1 1 1 1]
[0 0] [1 1] [0 0 0] [1 1]
[1 1] [0] [1] [1 1 1] [0] [1]
[0] [1] [1] [0] [0] [1 1] [0] [1]
与0 1 1 1最接近的是1 0 1 0
O(60N)
例三

N个点的边带权的树,找一条路径使XOR和最
大。
解法

任选根,hi表示从根到i的路径的XOR和

X到Y的路径的XOR和等于hx xor hy

转化为例二
例四

从N个数中选出若干个,使XOR和为K,给出
方案或指出不可行。
解法

Xi=0示第i个数不选,Xi =1表示选

考虑K的p位




若是1,则第p个二进制位为1的数字有奇数个被选
否则偶数个被选择
得到方程Xi1 + Xi2 + …… + Xis = Kp (‘+’为异或)
联立60个方程,方程的解等价于原问题的解
高斯消元

设N个未知数,M个方程,A为系数矩阵


k=1
for i = 1 to N

若存在j>=k使得Aj,i为1则





交换第j行与第k行
用第k行对之后的行进行消元
k=k+1
否则第i个变量是自由变量,k不变
时间复杂度O(NM2)
解的判断

无解


唯一解


存在方程系数全为0,常数项不为0
无自由变量
多解:


出现了S个自由变量,这些变量可任意取值从而确
定其余变量的值
2S组解
例子

N=4K=7

N个数为 5 6 3 4




X1 + X3 = 1
X2 + X3 = 1
X1 + X2 + X4 = 1
欢迎上台解方程
位运算优化

一个int64/long long储存60个bit

取出X的第i位:X and 2i-1

两行做异或:A xor B
例五

在例四的基础上,给定M个限制,每个限制是
那N个数的一个子集,要求该子集中的数恰有
奇数个或偶数个被选择。
解法

给每个限制添加一个方程

用例四的方法解决
例六

从N个数中选出任意个数,使XOR和最大。


O(N*603)? O(N*602)? ((N/60)*602)?O(N*60)?
最简洁的算法?
解法一

从高到低确定K的每一位,设当前考虑第i位



判断可行


若Ki = 1可行则确定
否则Ki = 0
对前i位列方程,使用例四的方法
时间复杂度O(N*603)
解法二

确定第i位时,前面的方程已经消好元了

只需用前i-1个方程对第i个方程进行消元

例:前方程组中添加X1 + X2 + X3 + X4 = 0

时间复杂度O(N*602)

使用位运算可以优化为O((N/60)*602)
解法三

从前到后考虑每一个数,若它可被之前的数凑
出则可以直接将其扔掉

维护已有的独立数的上三角矩阵,相当于将A
旋转90度后进行高斯消元

直接确定最终答案,O(N*60)
例七

从N个数中选出任意个数,求能得到的XOR和
的种数。
解法

利用例六的解法三


设有T个独立数,答案为2T
为什么不会有重复?

其它解法?

建议学习《线性代数》相关知识
例八

从N个数中选出任意个数,使它们的XOR和与
K的XOR和最大。
解法

例六解法三,直接确定答案
概览二(十分钟)


N个点M条边的边带权的无向图,把点分成两个集合,使处于两集合
之间的边的XOR和最大。(提示:1,2,5,10,20,50,100。7种币值可凑
出所有面值)
N个点M条边的边带权的无向图,求一个回路使XOR和最大。

用第5题的思路。



用第9题的思路。




方程的解与回路一一对应吗?证明之。
时间复杂度?
最少需要多少种“币值”?证明之。
如何构造这样一组“币值”。
上一题的makedata怎么写?
N个点M条边的边带权的无向图,求一条1号点到N号点的路径,使
XOR和最大。
例九(XOR最大割)


N个点M条边的边带权的无向图,把点分成两
个集合,使处于两集合之间的边的XOR和最
大。
提示:1,2,5,10,20,50,100。7种币值可凑出所
有面值。
解法

设hi为i的邻边的XOR和

一个割{S,T} = ∑hi(i在S中) = ∑hi(i在T中)

转化为例六
例十(XOR最大环)

N个点M条边的边带权的无向图,求一个回
路使XOR和最大。

用第5题的思路。



方程的解与回路一一对应吗?证明之。
时间复杂度?
用第9题的思路。


最少需要多少种“币值”?证明之。
如何构造这样一组“币值”。
解法一

Xi表示第i条边是否在路径中

点的邻边中恰有偶数条被取

N个方程,M个变量
方程的解与回路的对应性

回路均满足方程

方程的解可能是若干不连通的回路

走过来再走回去,XOR和不变
时间复杂度

转化为例五+例六

只能使用解法二

O((M/60)N(N+60))
解法二

两个回路的和仍是回路



‘和’ 指 ‘异或和’/‘对称差’
连通性问题
结论:一个无向连通图G中有且仅有M-N+1个
独立回路。
数学归纳法


M=N-1时,树,结论成立
设M=K时结论成立,当M=K+1时,任取G中一
条边e,G-e中有K-N+1个独立回路,且




任取一个包含e的回路C,显然独立于之前的回路
任意两个包含e的回路C1与C2,C12=C1+C2是G-e的
回路,C2不独立
故能且仅能增加一个包含e的独立回路
从而G中恰有(K+1)-N+1个独立回路,证毕
构造法


任取原图一棵生成树T
对于每条不在T中的边e,取T+e的回路
时间复杂度

利用构造法,求出M-N+1个独立回路的XOR和

转化为例六

O((M+N)*60)

建议学习《图论》相关知识
例十一

例十的makedata怎么写?
解法

生成一个独立数集

随机生成一棵树的边权

对于每条非树边,确定其值使得该边对应的环
的XOR和可由独立数集生成
例十二(XOR最长路)

N个点M条边的边带权的无向图,求一条1号点
到N号点的路径,使XOR和最大。
解法

任意两条路径的和为一个环

任取一条1-N的路,找一个环与其XOR和最大

转化为例八
例十三

扩展思考:从N个数中选出不超过K个,使
XOR和最大。
例十四

扩展思考:在第10题基础上,限制求得的回路
是简单回路。
例十五

扩展思考:带权二分图,求一个完美匹配,使
XOR和最大。
zxr:对于任意完美匹配的答案为ans,缩点找环,转化
为:从所有环中选k个使其xor和与ans的xor值最大
Matrix

一个N*N的01矩阵,每个十字中有偶数个1

已经填好了M个数,求填完该矩阵的方案数

M<=N<=1000
解法

确定第一行后,可以递推确定剩下的格子,且
该方案合法当且仅当这样递推得出的第N+1行
全是0

第一行的N个格子作为未知数




递推求出第N+1行与第1行的关系,N个方程
已填数的信息,M个方程
该方程组的解数即为答案,O(N3/60)
每60个未知数压成一个数
POI2005dwa

一个无向图,将N个点分成两个点集,使得尽
量多的点满足:

邻居中有偶数个点和自己在同一集合

允许分出空集

N<=1000
解法

设点i的邻居为Si,Si中有偶数个点与i同集合



Xi表示第i个数所属的集合(0或1)


若di为奇,Si中两集合均包含偶数个点
若di为偶,{Si+i}中两集合均包含奇数个点
N个未知数,N个方程
猜想:该方程组一定有解,即答案为N
证明

见Matrix67的Blog
谢谢