高斯

来源:互联网 发布:mac 如何登陆建行网银 编辑:程序博客网 时间:2024/04/27 15:53

对于AX=B。的n个n元方程组。

高斯消元的过程是将A加上B,变成扩展矩阵。然后将之变换位上三角矩阵。O(n^3)的变化。大致思路就是选择枚举n行,计算该n以下的所有行,将之对应的将第i列消为0,

不过枚举n行的时候要主要先预处理一下使该行要交换的数值不为0。

消去的过程中,比较偷懒的方法是直接用double,不过基本是不现实的,剩下的就是用lcm来保证能够消掉。这样肯定可以保证精度,但是数字容易越来越大,很快就会破int 甚至int64,2008年的哈尔滨的D题就是利用高精度来实现n<=100内的高斯消元。不过我遇到的不少题目,都是同余方程,方程两边就是同余相同,比如开关问题之类的。

成为上三角矩阵后,就可以判断方程组解的情况,随便翻下书就可以知道矩阵的秩决定着无解,以及自由变量的情况,自由变量为0就是唯一解,自由变量不为0,就是无穷解。

这时候求解就有两种方程,很多网上流传的gauss版本就是直接开始求解。利用从n到1的逆循环,一个一个求解迭代,然后可以得到所有解。不过这不是一个好方法,利用那道高精度的高斯消元,然后利用迭代的,中间的解就会出现分数,不得不利用分数类来解决,反而增加了代码量和复杂性。

可以将上三角矩阵继续化解,化成下下三角矩阵,也就能得到对称矩阵。然后就是n个形如ax=b,超简单的式子,这样都不用分数类就可以解决了。

刚才提到高斯消元的题目由于数据规模的关系,虽然复杂度只有(N^3),但是由于精度,以及乘法容易爆int的关系,一般都是同余方程,那么最后就是化解成为了 ax=b(mod c),利用欧几里德扩展算法就可以轻松解决了。

但很多情况,不单单就解一个线性方程组就可以了,往往需要对解或解的个数进行适当的分析。

PKU 2065 ..最简单的就是高斯消元+解同余方程,注意看清题意以及输入转换成矩阵。

PKU1222 可以搜索过,但是正确性和复杂度以及运算时间都是不能和高斯消元比的。先列方程。就是30个30元的方程组。由于可逆矩阵的唯一性,解是唯一的。。不过还没证明是否一定有解,,不过貌似输入的所有数据都是有唯一解,,属于简单练模版题,注意这里的同余方程的mod 为2,可以医用位运算,不过高斯消元已经很快了。

PKU1830 注意建方程即可,和1222一个样,不过所求的就是解的个数,刚才提到线性方程组可能有无穷解。但在同余条件下,解的个数还是有限的,虽然这个题和1222类似,但是明显比1222更少的人AC了,关键可能就是对于高斯消元无穷解的产生的概念有所生疏,无穷解的产生主要是自由变量的个数的原因,顾名思义,自由变量就是可以任意取值的变量,自由变量的取值个数最后解的个数,由于是同余方程,自由变量的组合就有 (mod)^ (自由变量的个数)。。这个题里面就是1<<(n-方程的秩)

PKU1681 ..和1222一个模子印出来的,好像状态DP和搜索都可以过,但我用高斯消元很轻松就可以16ms过了。有点不同的这里要求所需要开灯的个数,mod还是2,就是最后解不为0的个数,一开始有点没想通,怎么判断解不为0的个数,其实最后只需要将(可开可不开的那些灯)自由变量,这里需要枚举所有所剩的灯的二进制状态,,枚举那些自由变量的解,然后根据枚举的信息解出别的灯的信息,然后统计解的个数,找到那个需要关灯数最少的那个最少值就可以了。