引入:在二維平面內,只需要用x軸、y軸的兩個單位向量,就可以表示出平面內的所有向量。
就是說,任何乙個二維平面的向量,都可以表示成
那就可以稱(
現在有n個數字,求它們的基,這個基 也就是可以通過基中的數字,通過 「異或」 就可以將原來的n個數字表示出來
(異或總知道吧,不知道可以看
這裡)。
換句話說就是我們可以在基中選取若干的數字,把他們異或一下,就可以得到原來的這個n個數字中的某個。
再換句話說,原來的這個n個數字都可以用基中的一些數字異或得到,還有,我怎麼覺得這一行字變成了深藍色,而上面的字是深綠色???
說了這麼多,怎麼得到這個基才是最重要的。
比如:現在有5個數字 8 、7 、5、3、2。
轉化成二進位制分別是:
8:1000
7:0111
5:0101
3:0011
2:0010
關於怎麼求基的事情,線性代數中給了我們方法。也就是說,下面的知識,需要掌握一些基本的線性代數的知識。現在我們把這5個數字,看成在四維座標下的5個向量,現在求它們的基(這不就變成一件輕而易舉的事情了)。
先搞出乙個矩陣:
然後把它用異或消成乙個上三角的矩陣。前面兩行不需要處理,直接從第三行開始看,第三行第二個數字1(從左往右數),需要消去,那麼我們就用第三行和第二行進行一次異或,那麼第三行第二個數字就變成0了,也就是:7異或5,得到2,第三行也就變成了0010。現在矩陣就是:
同樣的道理,對第四行數進行相同的操作,矩陣就變成了:
最後一行,用第三行的數字進行異或,也就變成了0000,最終
最後我們得到的數字:8,7,2,1,也就是8、7、5、3、2的基。試一試,是不是這5個數都可以由這基中的數字直接,或者若干個數字異或得到。差點忘記說了,由這5個數異或可以得到的數,線性基也一異或得到。比如這裡我們就可以通過異或得到:4。所以可以把基看成是對原資料的一種壓縮。
還有一些線性基的性質沒有說,線性基中的數字不管怎麼異或,都不會得到0,這和線性基的基性質是有關的,也就是說,用線性基中的數字去異或得到某個數字,這些數字只有一種組成。
線性基的一些普通操作:1.判斷乙個數能否由已知的n個數得到??直接把這個數插入這n個數的線性基,判斷最後是否成功插入不就是了。
2.n個數異或的第k大或者第k小???就是把k分成二進位制就是了,(還要再對這個矩陣消去右上角那些1,這個完整過程叫做高斯消元),我覺得一般來說就算不知道,都可推斷出來。
3.還有一些其他很簡單的、稍微一思考就能想到的問題就不說了。
注:**中的插入,其實就是在實現消元的過程。細節的地方,懂了**就可以領悟了。
最後,**:
#includeusing namespace std;
long long int line_base[63];
bool insert(long long int x)
int main()
for(int i=0;i<10;++i)
{cout<
作為開發人員,您應該尊重預設行為
原來自己也是emacs的粉絲 現在還是在用 拿到任何編輯器或是ide後第一件事情就是把快捷鍵切換為emacs模式。進入現在的公司後,經常要和別人pair,或是用別人的電腦,很不方便。從一位前輩那得到啟發,我們應該尊重預設行為。經常看到很多朋友在ide裡面自定義自己的快捷鍵,大多數情況下與預設的快捷鍵...