高斯消元:
解$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...