高斯入门
小结
- 总体来说,入门题需要用到高斯消元或者类似做法的题目还是比较明显的,剩下只需要套板子即可。
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_kverb'%')的概率往某个方向走(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)大就相当于二进制数取相应位的值求异或和即可。
代码