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 谢谢