高斯入门
高斯入门
小结
- 总体来说,入门题需要用到高斯消元或者类似做法的题目还是比较明显的,剩下只需要套板子即可。
HDU 5119 Happy Matt Friends
题意
- 给\(N(N \le 40)\)个数\(a_i(a_i \le 10^6)\)。
- 求有多少种方案使得若干个\(a_i\)的异或和不小于\(M(M \le 10^6)\)。
思路
- 高斯消元求出线性基。
- 枚举第\(i\)位表示在该位时异或和刚大于\(M\)。
- 假设线性基有\(x\)个,则每种异或和方案有\(2^{N-x}\)种。
代码
POJ 1830 开关问题
题意
- 有\(N(N \le 28)\)个开关,开关具有关联性,即改变某个开关的状态,一些相关的开关也会改变状态。给出初始状态和末状态,求操作方案数。
思路
- 这道题算是最基础的高斯消元题。
- 每个开关列一个方程,变量为和当前开关相关的开关以及它本身,结果为初状态和末状态的异或值,表示是否改变开关状态。
代码
POJ 3185 The Water Bowls
题意
- 一共有20个碗,1表示碗是盖着的,0表示正面朝上,每次翻转一个碗时,相邻的两个碗也会跟着翻转,问是否能把所有碗翻成正面朝上,若能求最少次数。
思路
- 有无解问题仍然可以通过解方程判断。
- 关键在于如何求出最少次数。高斯消元后,得到一组可行解,可枚举自由元状态,可能可以去掉一些可行解中的一些操作,在所有方案中取最小值即可。
代码
POJ 2065 SETI
题意
- 有\(N\)个方程,每个方程为\(f(k)=\sum_{i=0}^{n-1}{a_ik^i(mod \verb' 'p)}\),求解(按照题意来讲,应该保证有且仅有一组解)。
思路
- 明显的解方程,需要取模操作。
代码
HDU 4418 Time travel
题意
- (题目有毒,看了半天没看懂)
- 简单来讲,就是在一条数轴上有\(N(N \le 100)\)个点,每次会有\(P_k\verb'%'\)的概率往某个方向走\(k\)步,遇到边界会改变方向(即按0、1、2、3、2、1、0、1、2、...)这样的路线行走。
给出初始位置\(X\)、末位置\(Y\)以及初始方向\(D\),求期望步数。
思路
- 起始方向统一成往右走,若一开始往左走,则关于中间对称\(X\)、\(Y\)坐标即可。
- 初始一个长度为\(2N-2\)的数组a,表示所有可能的状态。因为一个点有两种状态,往左走和往右走。
- 期望逆推,整体不存在拓扑序,所以需要用高斯消元解方程求得每个状态的期望。
- 需要提前判定是否能从\(X\)走到\(Y\),某些\(P_k\)可能为0。
代码
HDU 3949 XOR
题意
- 给\(N(N \le 10^4)\)个数\(A_i(1 \le A_i \le 10^{18})\)。
- 从这些数中取一些数进行\(XOR\)操作,得到一些值,\(Q(Q \le 10^4)\)次询问这些值中第\(K\)大的值。
思路
- 用高斯消元的做法求出线性基,将这些基从小到大排序,则第\(K\)大就相当于二进制数取相应位的值求异或和即可。
代码