「線性基」學習小結

向量空間

向量空間亦稱線性空間。

形式化的,我們定義一個向量空間\((P,V,+,\cdot)\)

其中 \(P\)是一個域,\(V\)是一個非空的集合,其中的集合稱作向量,同時定義兩種運算分別為向量加法和標量乘法

一個\(P\)上的向量空間\((P,V,+,\cdot)\),需滿足以下8條公理(其中的\(u,v,w\in V\),\(a,b\)是標量):

  1. \(u+(v+w)=(u+v)+w\)
  2. \(u+v=v+u\)
  3. \(\exists\mathbf{0}\)\(s.t. \ \ v+\mathbf{0}=v\)
  4. \(\forall v\in V,\exists w\in V\)\(s.t.\) \(v + w = 0\)
  5. \(a(u+v)=au+av\)
  6. \((a+b)v=av+bv\)
  7. \(a(bv)=(ab) v\)
  8. \(\exists 1,s.t. \ 1 \cdot v=v\)

基(basis)

向量空間\(V\)的基是可以張成\(V\)的一個線性無關的向量組,其中的元素稱作基向量。

異或運算&線性基

把一個數的二進制表示看成是一個向量
\[ \mathbf{a}_i=(d_n,...d_0) \]
假設向量\(\mathbf{a}_0,\mathbf{a}_1,...\mathbf{a}_m\),的張成空間是\(S\)

定義一個向量空間\(V=(\{ 0,1\} ,S,xor,\cdot)\)

\(ps:\)這里,我們是把異或當作加法

求法

如何求出\(V\)的一個基\(\mathfrak{B}\)

我們要做的:是掃描每一個向量\(\mathbf{a}_i\),如果它存在于其它向量的張成空間中,就把它去掉

如何判斷每個向量能否被前面的向量張成得到?

我們利用高斯消元:

int a[MN],base[log_MN];
inline void calc()
{//n is the highest bitregister int i,j,k;for(i=0;i<=m;++i)for(j=n;~j;--j)if(a[i]>>j&1)//Scan every bit of a[I] from top to bottom{if(base[j]) a[i]^=base[j];else{//There's no vector for this bitbase[j]=a[i];/*Maintain a diagonal matrixfor(k=j-1;~k;--k) if(base[k]&&(base[j]>>k&1)) base[j]^=base[k];for(k=j+1;k<=n;++k) if(base[k]>>j&1) base[k]^=base[j];*/break;}}
}

復雜度是\(O(mn)\),若位數較多,通常采用bitset優化,復雜度是\(O(\frac{mn^2}{\omega})\)

可以發現,我們在維護一組向量\(base[]\),滿足\(base_i\)的最高位時\(i\)

為了方便,通常只把它消成一個上三角矩陣

當然,你也可以把它消成一個對角線矩陣,滿足每一位最多只存在于一個向量中

線性基的運用

在這里,我們不嚴謹地稱一個向量<另一個向量

其實指的是,每個向量對應的數的大小比較

查詢最值

貪心求最大值:

  1. 如果所求是對角線矩陣,直接將所有向量相加即可
  2. 如果所求的是上三角矩陣,從高到低遍歷每個向量,若ans加上當前的向量會變大,就將其貪心的加上

最小值是線性基中最小的向量

查詢第k小值

首先在去重的前提下。

首先我們求出對角線矩陣

那么,如果 \(k=(100101)_2\),我們所求的即為\(base_0 +base_2+base_5\)

也就是各位所對應的數Xor起來即可

查詢和是第幾大

如果在去重的前提下,和查詢第k小差不多。

如果不在去重的前提下的話:

\(m\)為給出數的個數, \(\mathfrak{B}\)為所求線性基

結論:每個數都出現一樣的次數,且這個次數為 \(2^{m - \vert \mathfrak{B}\vert}\)

證明:

所有不在線性基中的數的個數為 \(m - \vert \mathfrak{B}\vert\),我們任意選擇它的一個子集 \(S\),對于 \(S\) 中的每個數 \(v\),有唯一的方式表達為 \(\mathfrak {B}\)中向量的線性組合。我們對于每個 \(v\),將這個線性組合中的向量都選上(一個向量選多次可以看作是次數對\(2\)取模后的結果),兩個相同的數異或起來得到 \(0\),所以對于每個數 \(x\),我們都能找到至少\(2^{n - \vert \mathfrak{B}\vert}\) 種不同的選擇方案,使得異或值為 \(x\)。又因為對于每個子集 \(S\),為了使得最終異或值為 \(x\),選擇線性基中的向量的方案是唯一的,所以上界也是 \(2^{n - \vert \mathfrak{B}\vert}\)

(此結論同時出現在2019/2/24 福建四校聯考中的T1)

總結

觀察大佬博客Sengxian'blog后......

線性基的題型相對比較固定,看到下面的類型基本上都是線性基了:

  1. 最大異或和 (例題:luogu模板題)
  2. \(k\)大異或和/異或和是第幾大 (例題:bzoj 2844)
  3. 求所有異或值的和 (例題:bzoj 3811)

線性基中的題目中還用到一個技巧:

  • 任意一條\(1\)\(n\) 的路徑的異或和,都可以由任意一條 \(1\)\(n\) 路徑的異或和與圖中的一些環的異或和來組合得到。(例題:bzoj 2115)

這便是線性基的全部東西了。

Code

洛谷P3812

#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline ll read()
{ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define MN 55
ll n,base[MN],ans;
inline void insert(ll x)
{register int i,j;for(i=50;~i;--i)if(x>>i&1){if(base[i]) x^=base[i];else{base[i]=x;for(j=i-1;~j;--j)if(base[j]&&(base[i]>>j&1))base[i]^=base[j]; for(j=i+1;j<=50;++j)if(base[j]>>i&1)base[j]^=base[i];break;}}
}
int main()
{n=read();register int i;for(i=1;i<=n;++i) insert(read()); for(i=0;i<=50;++i) ans^=base[i];return 0*printf("%lld\n",ans);
} 

bzoj 2115 Xor

link

dfs出所有的環

求出它們的線性基

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline ll read()
{ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
const int MN=200005,mN=50005,_=61; 
ll a[MN],tp,dfn[mN],dind,Xor[mN],b[_];
struct edge{int to;ll w;int nex;}e[MN<<1];
int N,M,hr[mN],en;
ll ans=0;
inline void ins(int x,int y,ll w)
{e[++en]=(edge){y,w,hr[x]};hr[x]=en;e[++en]=(edge){x,w,hr[y]};hr[y]=en;
}
inline void tj(int x,int f)
{register int i;dfn[x]=++dind;for(i=hr[x];i;i=e[i].nex)if(e[i].to^f){if(!dfn[e[i].to]) Xor[e[i].to]=Xor[x]^e[i].w,tj(e[i].to,x);else a[++tp]=Xor[x]^Xor[e[i].to]^e[i].w;}
}
inline void calc()
{register int i,j,k;for(i=1;i<=tp;++i)for(j=_-1;~j;--j)if(a[i]>>j&1){if(b[j]) a[i]^=b[j];else{b[j]=a[i];break;}}ans=Xor[N];for(i=_-1;~i;--i) if((ans^b[i])>ans) ans^=b[i];
}
int main()
{N=read();M=read();int x,y;while(M--) x=read(),y=read(),ins(x,y,read());tj(1,0);calc();return 0*printf("%lld\n",ans);
}

2019福建四校聯考T1

link~

首先,容斥一下,轉而求異或值為1的個數
\[ans=(2^n-1)(2^m-1)-num1\]
然后,對于一行,如果這一行的異或值不為0,它總有\(2^{m-1}\)個選法,使得選出的點的異或值是1(易證)
把每行當做一個數,我們只需要求出有哪些行的異或值為0
\[num1=2^{m-1}*(2^n-cnt0)\]
我們求出線性基,根據線性基的性質,異或值為0的個數一定是\(2^{n - \vert \mathfrak{B}\vert}\)

/*
2019/2/26 15:21
*/
#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
const ll mod=998244353,MN=2005;
std::bitset<MN> a[MN],base[MN];
int N,M,B;
ll ans;
inline void calc()
{register int i,j,k;for(i=1;i<=N;++i)for(j=M-1;~j;--j)if(a[i][j]){if(base[j].count()) a[i]^=base[j];else{base[j]=a[i];break;}}for(i=0;i<M;++i) if(base[i].count()) ++B;
}
inline ll fpow(ll x,int m)
{ll r=1;for(;m;m>>=1,x=1ll*x*x%mod) if(m&1) r=1ll*r*x%mod;return r;
}
int main()
{freopen("password.in","r",stdin);freopen("password.out","w",stdout);N=read();M=read();register int i,j;for(i=1;i<=N;++i)for(j=0;j<M;++j) a[i][j]=read()==1;calc();ans=(1ll*(fpow(2,N)-1)*(fpow(2,M)-1)%mod+mod)%mod;ans-=(1ll*fpow(2,M-1)*(fpow(2,N)-fpow(2,N-B)+mod)%mod)%mod;ans+=mod,ans%=mod;return 0*printf("%lld\n",ans);
}

暫時咕咕咕。


Blog來自PaperCloud,未經允許,請勿轉載,TKS!

轉載于:https://www.cnblogs.com/PaperCloud/p/10428084.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275790.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275790.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275790.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ux體驗網站 英國_定義網站圖像時的UX注意事項

ux體驗網站 英國As the saying goes —俗話說 - “A picture is worth a thousand words.”“一張圖片勝過千言萬語。” When creating content on the web, it’s often recommended to be using high-quality imageries and making sure that the images serve its purpose …

iconfont 支持全新的彩色字體圖標

大家好&#xff0c;我是若川。iconfont我相信大家都用過&#xff0c;而現在支持全新的彩色字體圖標了。這是第二次轉載&#xff0c;上一次的好文是2020 前端技術發展回顧。點擊下方卡片關注我、加個星標學習源碼整體架構系列、年度總結、JS基礎系列一直以來&#xff0c;Web 中想…

回文算法java實現_java算法題:最長回文串

LeetCode: 給定一個包含大寫字母和小寫字母的字符串&#xff0c;找到通過這些字母構造成的最長的回文串。在構造過程中&#xff0c;請注意區分大小寫。比如"Aa"不能當做一個回文字符串。注 意:假設字符串的長度不會超過 1010。思路&#xff1a;利用hashset&#xff0…

Spring校驗@RequestParams和@PathVariables參數

我們在寫Rest API接口時候會用到很多的RequestParam和PathVariable進行參數的傳遞&#xff0c;但是在校驗的時候&#xff0c;不像使用RequestBody那樣的直接寫在實體類中&#xff0c;我們這篇文章講解一下如何去校驗這些參數。 依賴配置 要使用Java Validation API&#xff0c;…

出色的社區網站_《最后的我們》中出色的制作系統

出色的社區網站游戲設計分析 (GAME DESIGN ANALYSIS) The Last of Us became an instant classic the day it was released, back in 2013. At the sunset of the sixth console generation, it felt like Naughty Dog managed to raise the bar in all critical areas of game…

入坑 Electron 開發跨平臺桌面應用

?作為一個跨平臺的桌面應用開發框架&#xff0c;Electron 的迷人之處在于&#xff0c;它是建立在 Chromium 和 Node.js 之上的 —— 二位分工明確&#xff0c;一個負責界面&#xff0c;一個負責背后的邏輯&#xff0c;典型的「你負責貌美如花&#xff0c;我負責賺錢養家」。上…

Google 拼音會導致卡 Ctrl 鍵?

如果你使用 Windows 7 系統&#xff0c;并同時安裝了 Google 輸入法&#xff0c;那么 Firefox 啟動時、WoW 時一定也常遇到卡住 Ctrl 鍵的問題。 今天仔細搜索了下&#xff0c;傳說將輸入法中“Ctrl鍵快速定位”關閉即可&#xff0c;有待驗證&#xff0c;先記錄著…轉載于:http…

java 接口編程_JAVA面向接口編程

一、什么是面向接口編程要正確地使用Java語言進行面向對象的編程&#xff0c;從而提高程序的復用性&#xff0c;增加程序的可維護性、可擴展性&#xff0c;就必須是面向接口的編程。面向接口的編程就意味著&#xff1a;開發系統時&#xff0c;主體構架使用接口&#xff0c;接口…

不僅僅是手機,MWC現全球首例 5G NR 商用部署

近日&#xff0c;MWC大會在在巴塞羅那舉行&#xff0c;5G折疊手機和5G部署進度成為這屆大會的重點。除了華為與三星發布的折疊手機外&#xff0c;本屆大會另一個值得關注的要點是三星和賽靈思宣布推進5G NR 商用部署在韓國落地&#xff0c;這應該是全球首例 5G 新無線電 (NR) 商…

小程序 顯示細線_精心設計:高密度顯示器上的細線

小程序 顯示細線Despite the many benefits of Retina displays, there is one clear drawback that must be considered when designing for high-density screens:盡管Retina顯示器具有許多優點&#xff0c;但在設計高密度屏幕時仍必須考慮一個明顯的缺點&#xff1a; 必須避…

React 入門手冊

大家好&#xff0c;我是若川。推薦這篇可收藏的React入門手冊。也推薦之前一篇類似的文章《如何使用 React 和 React Hooks 創建一個天氣應用》。點擊下方卡片關注我、加個星標React 是目前為止最受歡迎的 JavaScript 框架之一&#xff0c;而且我相信它也是目前最好用的開發工具…

函數04 - 零基礎入門學習C語言35

第七章&#xff1a;函數04 讓編程改變世界 Change the world by program 上節課的練習簡單講解,給力&#xff01;&#xff01; 1.自己實現pow()函數并嘗試驗證…… 2.猜想下sqrt()函數的原理并嘗試編程……&#xff08;暫時只要求整型數據&#xff09; 3.編寫一個用來統…

java數據結構與算法_清華大學出版社-圖書詳情-《數據結構與算法分析(Java版)》...

前 言數據結構是計算機程序設計重要的理論技術基礎&#xff0c;它不僅是計算機學科的核心課程&#xff0c;而且已經成為計算機相關專業必要的選修課。其要求是學會分析、研究計算機加工的數據結構的特性&#xff0c;初步掌握算法的時間和空間分析技術&#xff0c;并能夠編寫出結…

根號 巴比倫_建立巴比倫衛生設計系統

根號 巴比倫重點 (Top highlight)In this post I’ll explain the first phase of creating our Babylon DNA, the design system for Babylon Health, and how we moved the Babylon design team from Sketch to Figma.在這篇文章中&#xff0c;我將解釋創建巴比倫DNA的第一階…

《Migrating to Cloud-Native Application Architectures》學習筆記之Chapter 2. Changes Needed

2019獨角獸企業重金招聘Python工程師標準>>> Cultural Change 文化變革 A great deal of the changes necessary for enterprise IT shops to adopt cloud-native architectures will not be technical at all. They will be cultural and organizational changes t…

前端,你要知道的SEO知識

大家好&#xff0c;我是若川。三天假期總是那么短暫&#xff0c;明天就要上班了。今天推薦一篇相對簡單的文章。點擊下方卡片關注我、加個星標之前有同學在前端技術分享時提到了SEO&#xff0c;另一同學問我SEO是什么&#xff0c;我當時非常詫異&#xff0c;作為前端應該對SEO很…

編制網站首頁的基本原則

編制網站首頁的基本原則如下&#xff1a; 1、編制網站首頁的超文本文檔的組織結構應清晰&#xff0c;條理分明&#xff0c;重點突出&#xff0c;可讀性強&#xff0c;盡可能吸引用戶的注意力。 2、說明文字應簡明扼要&#xff0c;切中要害&#xff0c;每項內容介紹盡可能簡單明…

MySQL數據庫語句總結

增insert into -- 刪 delete from -- 改 update table名字 set -- 查 select * from -- 一&#xff0e;SQL定義 SQL&#xff08;Structure Query Language&#xff09;結構化查詢語言&#xff1a; &#xff08;一&#xff09;DDL&#xff08;Data Definition Language&#…

高安全性同態加密算法_壞的同態性教程

高安全性同態加密算法I was going to write at length about the issues I see in neumorphism and why this trend should be avoided. I know any attempt to guide my most impressionable colleagues away from it, will end up being failing because this fad is going t…

前端容易忽略的 debugger 調試技巧

大家好&#xff0c;我是若川。我們日常開發碰到的很多問題&#xff0c;通過 debugger 都能快速定位問題&#xff0c;所以推薦這篇大家容易忽略的調試技巧。會定位問題&#xff0c;可以節省很多時間。也就是我經常說的工欲善其事&#xff0c;必先利其器。也是為什么我經常強調調…