知識點 高斯消元 線性基

2022-05-19 02:42:39 字數 1693 閱讀 4932

高斯消元:

解$n$元一次方程組的通用方法,大部分時候用於解決沒有明顯轉移順序的dp。

考慮將方程組列成乙個$n\times (n+1)$的矩陣$a$,然後依次列舉每乙個未知數$j$(第$j$列):

從上往下找到第乙個$i$,滿足$i\geq j,a_\neq 0$。

如果找不到則該方程組無解,退出。否則把第$i$行與第$j$行交換。

對於任意$k\neq j$,用第$j$行消第$k$行,使其滿足$a_=0$。

顯然最後消出的是乙個對角線矩陣(只在$a_$處不為0),此時方程組的解$x_=\frac}}$。

複雜度$o(n^)$。

#include#define maxn 505

#define maxm 500005

#define inf 0x7fffffff

#define ll long long

#define rint register int

#define debug(x) cerr<

namespace

std;

int n; double

a[maxn][maxn];

inline

intread()

inline

bool

gauss()

if(a[j][j]==0) return0;

for(int i=1;i<=n;i++)

}return1;

}int

main()

高斯消元

線性基:

用若干個線性基底表示乙個向量空間,一般用來解決異或問題。

例如:你有乙個序列a,支援插入操作和查詢操作,每次詢問在a中選乙個子集的最大異或和是多少。

考慮把序列中的每個數拆成m位二進位制,構成乙個$n\times m$的01矩陣,我們只要把這個矩陣消成乙個上三角矩陣就行了。

用高斯消元寫的話每次插入都要重構一遍,不夠優秀。

考慮不需要重構的支援插入的做法,設當前插入的數為x,從高位到低位列舉二進位制位p:

這樣消出的是乙個可能有重複列的上三角矩陣。

如果希望消出乙個沒有重複列的上三角矩陣,只需要在結束列舉時:

複雜度$o(n\log})$。

#include#include

#include

#include

#define maxn 100005

#define maxm 50

#define inf 0x7fffffff

#define ll long long

using

namespace

std;

ll n,a[maxn],p[maxm+5

];inline ll read()

intmain() else a[i]^=p[j];

} ll ans=0

;

for(ll i=maxm;i>=0;i--)

if((ans^p[i])>ans) ans^=p[i];

printf(

"%lld\n

",ans);

return0;

}

線性基樹上高斯消元:

設$f_i =a_i f_}+b_i$,從下往上遞推即可。

線性基,高斯消元總結

所以,對於每個數進行二進位制掃瞄,若第i位為1,判斷這位是否有數,如果有,則異或上這個數,否則把第i位上的數設為這個數,並結束這個數的掃瞄。合併 把乙個線性基中的數暴力插入另乙個即可 設數的長度為l,那麼構建n個數的線性基的複雜度為 o nl 合併複雜度為 o l 2 不支援刪除。應用 涉及到異或和...

bzoj 2844 線性基 高斯消元

又用到線性基 高斯消元的套路題了,因為經過高斯消元以後的線性基有非常好的序關係,所以這種套路還是經常考到的。求出乙個經過高斯消元的基以後,根據基裡面的元素個數可以確定值域的數的個數,並且給定乙個k也可以求出第k小的元素。那麼如果把序列的元素個數比線性基的秩多出來的那些元素,其實就是把值域翻倍了。每多...

HDU 3949 XOR 線性基 高斯消元

hdu 3949 xor hdu3949xor 搞死消元找到一組線性無關組 消出對角矩陣後 對於k二進位制拆分 對於每列只有有乙個1的,顯然可以用k的二進位制數直接異或得到第k大 對於一列由多個1的,由於二進位制性質,由於2的冪 1次方比2的 1到冪 的和要大,所以不影響大小 include inc...