洛谷P3389 高斯消元 / 高斯消元+线性基学习笔记
高斯消元
其实开始只是想搞下线性基,,,后来发现线性基和高斯消元的关系挺密切就一块儿在这儿写了好了QwQ
先港高斯消元趴?
这个算法并不难理解啊?就会矩阵运算就过去了鸭,,,
算了都专门为此写个题解还是详细港下趴,,,
就每次选定一个未知数,通过加减消元使得所有方程中只有一个方程中它的系数不为0
然后这么一直做下去最后就会得到一个,这样的东西
a是系数b是方程右边的那个玩意儿
然后就输出b/a就成了,,还挺简单的是不是x就模拟了一个加减消元
然后就放代码趴
- #include<bits/stdc++.h>
- using namespace std;
- ][],inf=1e-;];];
- long long read()
- {
- ;;
- '))ch=getchar();
- ,ch=getchar();
- )+(x<<)+(ch^'),ch=getchar();
- return y?x:-x;
- }
- int main()
- {
- int n=read();
- ;i<=n;i++);j<=n+;j++)a[i][j]=read();
- ;i<=n;i++)
- {
- ;;
- ;j<=n;j++))mx=fabs(a[j][i]),p=j;
- );
- w[i]=p;pd[p]=;
- ;j<=n;j++)
- ;k<=n+;k++)a[j][k]-=(double)t*a[p][k];}
- }
- ;i<=n;i++)printf(]*1.00000/a[w[i]][i]);
- ;
- }
- //最近爱上了压行,,,看到以前的代码居然觉得太长了真是看不顺眼x
lq怎么这么蠢啊,,,
umm然后顺便还是注释下,就是,如果不想掉精度的话,在这道题中我是每次消元的时候都精心挑选了一下的都是选的系数最大的,这样精度就掉得少些quqqqqq
但是反正高斯消元也不是重点嘛
今天主要是想研究下
线性基
线性基篇!
线性基的定义,,,看了一个学长的博客,本来一脸懵的现在大概还是懂了点儿quqqqqq
线性基:
线性基其实就是构造出一组序列p0,p1...,pn
使得 从这些数中任选一个子集的异或和的值域同等与从原序列中任选一个子集的异或和的值域。
(这里看到另一篇博客中做出了这样的理解:线性基可以算是整个集合的一个压缩)(可以把n个数压缩成二进制中最大位数的个数个)
同时保证:pi在二进制下的最高位是2i
umm其实我觉得定义没有太大的用再了解下性质就可以进入正题辣
线性基有一些性质:
1.线性基的异或集合中不存在0,也就是说,β是V中线性无关的极大子集(因此在高斯消元碰到线性相关题目可以用线性基硬刚x
2.线性基中每个元素的异或方案唯一,也就是说,线性基中不同的异或组合异或出的数都是不一样的(这个与性质1其实是等价的.因为线性无关鸭QwQ←也可以这么想,就是因为不存在0,如果有一样的那再异或一下不就存在0了嘛QAQ
3.线性基的二进制最高位互不相同(因为保证了pi在二进制下的最高位是2i
4.如果线性基是满的,它的异或集合为[1,2n−1](*这一个点我还没有get呜呜呜
5.线性基中元素互相异或,异或集合不变(因为它是个压缩,能get趴?
然后!有一个我jio得对于线性基特别特别好的解读,我放下QwQ
有一个数集 S,现在可以任取 S 的一个子集,并把这个子集中的所有数异或起来,得到一个新数 t。令所有可行的 t 的集合为 T。线性基可以用于快速确定 T 的信息。
用 n 表示|S|,令 S 中每个元素∈ [0,2m)
线性基的本质就是高斯消元的矩阵,令 S 中的数为x1...n,xi二进制分解后为xi,0…m−1,如果我们要判断某个数 t 能否被组合,用布尔变量yi表示是否选择xi,我们可以列出异或方程组x1,0y1 xor x2,0y2 xor ... xor xn,0yn = t0
x1,1y1 xor x2,1y2 xor ... xor xn,1yn = t1
........
x1,m-1y1 xor x2,m-1y2 xor ... xor xn,m-1yn = tm-1
然后我们可以进行消元,消元之后每一列最多只有一个元素。也就是说,线性基中有贡献的元素个数 k 不超过 m。所以它可以极大地简化一个集合的表示。
因为线性基本质就是高斯消元,所以判断 t 能否被凑出,只要按照高斯消元求解的方法, 依次确定每一位即可。
同时,由于每一列最多一个元素,所以线性基中的 k 个元素是互不影响的,那么集合 S 能够异或出的不同的数的个数就为2k
然后就港下操作和应用好了quqqqqq
应用的话目前学到了的有三种:
首先最直接的可以用来高斯消元处理线性相关
然后还可以求,第k大
然后求异或和最大的时候用它可以按位贪心了
umm然后港下它滴实现?
构造:
直接对读入的数二进制地从前往后扫
如果扫到一个位置是1就判断一下,如果已经有这一位是1的数了就异或一下这个最高位是1的数(为了维护性质&定义)
如果没有最高位这里是1的数就放进去并停止扫描
然后就成功构造完成辣!
可以发现这样的话我们放入一个数就只会有俩结果
第一个,能扫到,于是在过程中就会被放进去并停止扫描
第二个,一直到了最后它变成0就退出了,这就说明它是能被表示出来的了(就可以把所有把它的有1的位数作为最高位的线性基异或起来就能表示出来,get?
- ,){<<i)){if(!p[i] ){p[i]=x;return;}x^=p[i];}}}
还是,放下代码趴
合并:
线性基的合并就直接合并就好了鸭,放下代码QwQ
- xxj merg(xxj gd,xxj gs){my(i,,)if(!gd.p[i])gs.inst(gd.p[i]);return gs;}
这儿是代码QwQ
查询是否能表示出:
再插入那一段中我们港,如果它变成0说明它可以表示出来了,所以我们就能get辣,直接insert操作修改一下就欧克
查询max:
两种,分别港下QwQ
第一个是可以直接每次判断异或这个基底之后会不会变大,会就异或就欧克
另一种因为和后面那个第K大一块儿说所以看后面趴QAQ
查询第k大:
这里还是有一点儿小技巧的趴,,,
就构造完线性基之后对它rebuild的一下,使得每一位最多有一个数为1
具体的实现就跟高斯消元似的搞下就好
然后假如当前位为1,且后面有cnt位,显然比它小的就是有2cnt个(0这种细节什么的特殊考虑下就好,,,
然后就欧克了,也放下代码趴QwQ
- il ,)my(j,i-,)<<j))q[i]^=q[j];rp(i,,)if(q[i])p[++cnt]=q[i];}
- il void query()
- {
- ll x=rd();<<(cnt+)))return void(printf("-1\n"));
- ll ;my(i,cnt,)<<i))as^=p[i];return void(printf("%lld\n",as));
- }
最后放下题单,,,都是些比较基础的,只有线性基的知识点的题目QwQ
(有几个[x]的链接是题解,,,其他的是题目QwQ
[X] 线性基模板
[X] 元素
[X] 新Nim游戏
[X] 最大XOR和路径
[X] 幸运数字
[ ] 玛里苟斯
[ ] albus就是要第一个出场
[X] XOR
洛谷P3389 高斯消元 / 高斯消元+线性基学习笔记的更多相关文章
- 洛谷P4151 [WC2011]最大XOR和路径(线性基)
传送门 不知道线性基是什么东西的可以看看蒟蒻的总结 首先看到异或就想到线性基 我们考虑有一条路径,那么从这条路径走到图中的任意一个环再走回这条路径上,对答案的贡献是这个环的异或和,走到这个环上的路径对 ...
- 【洛谷P3389】(模板)高斯消元
对于高斯消元法求解线性方程组, 我的理解就类似于我们在做数学题时的加减消元法, 只是把它写成一个通用的程序运算过程 对于一个线性方程组,我们从左往右每次将一列对应的行以下的元通过加减消元消去, 每个元 ...
- 洛谷P2973 [USACO10HOL]赶小猪(高斯消元 期望)
题意 题目链接 Sol 设\(f[i]\)表示炸弹到达\(i\)这个点的概率,转移的时候考虑从哪个点转移而来 \(f[i] = \sum_{\frac{f(j) * (1 - \frac{p}{q}) ...
- 洛谷3317 SDOI2014重建(高斯消元+期望)
qwq 一开始想了个错的做法. 哎 直接开始说比较正确的做法吧. 首先我们考虑题目的\(ans\)该怎么去求 我们令\(x\)表示原图中的某一条边 \[ans = \sum \prod_{x\in t ...
- 洛谷P3389 【模板】高斯消元法
P3389 [模板]高斯消元法 题目背景 Gauss消元 题目描述 给定一个线性方程组,对其求解 输入输出格式 输入格式: 第一行,一个正整数 n 第二至 n+1行,每行 n+1 个整数,为a1,a ...
- 洛谷——P3389 【模板】高斯消元法
P3389 [模板]高斯消元法 以下内容都可省略,直接转大佬博客%%% 高斯消元总结 只会背板子的蒟蒻,高斯消元是什么,不知道诶,看到大佬们都会了这个水题,蒟蒻只好也来切一切 高斯消元最大用途就是解多 ...
- 【洛谷P3389 【模板】高斯消元法】
这是个版子题,当然本蒟蒻也是看了好几天才明白 对于这样的线性方程组,我们可以看成是一个矩阵 对于百度百科给的定义(我感到很迷)赶脚和行列式有的一拼 但我们要注意的是: 行列式是一个确切的值(有关行列式 ...
- 洛谷P3389 【模板】高斯消元法(+判断是否唯一解)
https://www.luogu.org/problemnew/show/P3389 这里主要说说怎么判断不存在唯一解 我们把每一行的第一个非零元称为关键元 枚举到一个变量,如果剩下的行中该变量的系 ...
- 洛谷 P3389 【模板】高斯消元法
以下这个好像叫高斯约旦消元法,没有回代 https://www.luogu.org/blog/37781/solution-p3389 #include<cstdio> #include& ...
随机推荐
- 把Model改成Lib
1.把库的Activity删掉 2.把库的Application节点内容删掉 3.apply plugin:' 包名.library' 4.把ApplicationId去掉, 导入即可使用
- webform的学习(2)
突然回想一下,两周之后放假回家,三周之后重返学习,四周之后就要真正的面对社会,就这样有好多的舍不得在脑海中回旋,但是又是兴奋的想快点拥有自己的小生活,似乎太多的人在说程序的道路甚是艰难,我不知道我的选 ...
- codeforces水题100道 第二十四题 Codeforces Beta Round #85 (Div. 2 Only) A. Petya and Strings (strings)
题目链接:http://www.codeforces.com/problemset/problem/112/A题意:忽略大小写,比较两个字符串字典序大小.C++代码: #include <cst ...
- rabbitmq queue_declare arguments参数注释
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_26656329/article/details/77891793说明官方文档 在创建queue ...
- VMware Workstation 14 黑屏的一个解决办法
近期很多朋友遇到了VMware Workstation 14开启或新建虚拟机后黑屏的现象,同时发现如果挂起虚拟机,可以显示挂起前最后的画面.显然,虚拟机核心是正常工作的,只是“显示”方面出现了问题. ...
- Linux IPC BSD Pipe
mkfifo() //创建有名管道(FIFO special file),创建完了就像普通文件一样open(),再读写,成功返回0,失败返回-1设errno.VS$man 3 mkfifo #incl ...
- @OneToMany、@ManyToOne以及@ManyToMany讲解
一.一对多(@OneToMany)1.单向一对多模型假设通过一个客户实体可以获得多个地址信息.对于一对多的实体关系而言,表结构有两种设计策略,分别是外键关联和表关联.(1) 映射策略---外键关联在数 ...
- mysql里查看时间
MariaDB [jumpserver]> select current_time;+--------------+| current_time |+--------------+| 16:22 ...
- 【CF720D】Slalom 扫描线+线段树
[CF720D]Slalom 题意:一个n*m的网格,其中有k个矩形障碍,保证这些障碍不重叠.问你从(1,1)走到(n,m),每步只能往右或往上走,不经过任何障碍的方案数.两种方案被视为不同,当且仅当 ...
- [VS]VS2010如何使用Visual Studio Online在线服务管理团队资源(在线TFS)
前言 Visual Studio Online,也就是以前的Team Foundation Service,从名字可以看出这是一个团队资源管理服务.在微软的云基础架构中运行,无需安装或配置任何服务器, ...