定理1.費馬小定理
:費馬小定理是數論中的一個重要定理,其內容爲: 假如p是質數,且gcd(a,p)=1,那麼 a^(p-1) ≡1(mod p) 假如p是質數,且a,p互質,那麼 a的(p-1)次方除以p的餘數恆等於1。
定理2.模乘法得逆
:對於兩個整數a,b,a/b是整數,且a和b除以mod得餘數分別爲aa,bb,則a/b除以mod得餘數爲(aa*bb^(-1))%mod,其中b^(-1)是b的逆.
(當(a*b)%mod=1是,我們稱a和b互爲乘法的逆,即a=b^(-1),b=a^(-1))
相關代碼:
- void gcd(LL a,LL b,LL &d,LL &x,LL &y)//拓展歐幾里得定理,求ax+by=gcd(a,b)的一組解
- {
- if(!b){d=a;x=1;y=0;}
- else{gcd(b,a%b,d,y,x);y-=x*(a/b);}
- }
- LL inv(LL a,LL n)//求得a在模n條件下的逆
- {
- LL d,x,y;
- gcd(a,n,d,x,y);
- return d==1?(x+n)%n:-1;
- }
推論1:mod爲質數,由費馬小定理得b^(mod-1)%mod=1-->(b*b^(mod-2))%mod=-1,所以b的逆=b^(mod-2).
對於整數a,b(b<mod),且a/b是整數,則a/b除以mod得餘數是(a%mod*b^(-1))%mod-->(a%mod*b^(mod-2))%mod.可用於求分數形式整數的模
定理3.SG定理
組合遊戲:一個狀態是必敗狀態當且僅當它的所有後繼都是必敗狀態;一個狀態是必勝條件當且僅當它至少有一個後繼是必敗狀態
組合遊戲的和。假設有k個組合遊戲G1,G2,...Gk,可以定義一個新遊戲,在每個回合中,
當前遊戲可以任選一個子遊戲Gi進行一次合法操作,而讓其他遊戲的局面保持不變,不鞥操作的遊戲者輸。
這個新遊戲稱爲G1,G2,...,G3的和
SG函數和SG定理。對於任意狀態x,定義SG(x)=mex(S),其中S是x的後繼狀態的SG函數值集合,mex(S)表示不在S內的最小非負
整數。SG(x)當且僅當x爲必敗狀態.遊戲和的SG函數SG函數等於各子游戲SG函數的Nim和。
Bouton定理:狀態(x1,x2,x3)爲必敗狀態當且僅當x1^x2^x3=0,稱爲Nim和。可看做SG定理在Nim遊戲中的運用
例子:UVALive/LA 5059+UVA 10561+UVA 12293
定理4.pick定理
給定一個頂點均爲整點(即座標爲整數的點)的簡單多邊形,其面積A和內部格點數目I與邊上格點數目B的關係式:A=I+B/2-1.
定理5.Lucas定理
A、B是非負整數,p是質數。AB寫成p進制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]。則組合數C(A,B)與C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0]) mod p同餘
即:Lucas(n,m,p)=c(n%p,m%p)*Lucas(n/p,m/p,p)
例子:poj 3146
定理6.歐拉定理
a^(phi(n))≡1(mod n) (a,n互質), phi(n)是歐拉函數,表示不超過n的且與n互質的數的個數。
例子:hdu3307
定理7.五邊形數定理
可用於生成函數(母函數):
(1-x-x^2+x^5+x^7-x^12...)(1+p(1)x+p(2)x^2+p(3)x^3)=1;(整數劃分的生成函數爲1/∏(1-x^i))
得到p(n)=p(n-1)+p(n-2)-p(n-5)-p(n-7)+...
定理8.柯尼希定理(最小頂點覆蓋,二分圖匹配,匈牙利算法)
資料源自:http://zh.wikipedia.org/wiki/%E8%A6%86%E7%9B%96_(%E5%9B%BE%E8%AE%BA)
http://baike.baidu.com/link?url=5gWVO-A8T_AUGw21_P85QiijE7T934ecsDq-50f8SMh02Vpd1tIuTSgjD4cS922u
圖G的頂點覆蓋是一個頂點集合V,使得G中的每一條邊都接觸V中的至少一個頂點。我們稱集合V覆蓋了G的邊。最小頂點覆蓋是用最少的頂點來覆蓋所有的邊。頂點覆蓋數是最小頂點覆蓋的大小。
二分圖又稱作二部圖,是圖論中的一種特殊模型。 設G=(V,E)是一個無向圖,如果頂點V可分割爲兩個互不相交的子集(A,B),並且圖中的每條邊(i,j)所關聯的兩個頂點i和j分別屬於這兩個不同的頂點集(i ∈A,j ∈ B),則稱圖G爲一個二分圖。
無向圖G爲二分圖的充分必要條件是,G至少有兩個頂點,且其所有迴路的長度均爲偶數。
匈牙利算法:它是一種用增廣路徑求二分圖最大匹配的算法。
http://baike.baidu.com/link?url=1U3pNCTlWDbUG1A-YexAqNo_D_1rpFEKBO7IBcjq7d3_MY7MwhCAxeF5MnXW4O-5
- int find(int cur) //判斷增廣路是否存在
- {
- int i, k;
- for(i = 0; i < map[cur].size(); i++)
- {
- k = map[cur][i];
- if(!flag[k])
- {
- flag[k] = true;
- if(pre[k] == -1 || find(pre[k]))
- {
- pre[k] = cur;
- return 1;
- }
- }
- }
- return 0;
- }
- for(i = 0; i < n; i++)
- {
- memset(flag, false, sizeof(flag));
- sum += find(i);
- }
sum就是最大匹配值。
柯尼希定理是這樣一個定理:二分圖最小點覆蓋的點數=最大匹配數。
poj 3041;poj1422,2239,1422,1325,1719,2594,2195,2446,1904,3342,3216,3020
一個PXP的有向圖中,路徑覆蓋就是在圖中找一些路徑,使之覆蓋了圖中的所有頂點,
且任何一個頂點有且只有一條路徑與之關聯;(如果把這些路徑中的每條路徑從它的起始點走到它的終點,
那麼恰好可以經過圖中的每個頂點一次且僅一次);如果不考慮圖中存在迴路,那麼每條路徑就是一個弱連通子集
最小路徑覆蓋的邊數=頂點數n-最大匹配數
最大獨立集:在二分圖G中,點集合M,M中的各個點都不相連,則稱M爲G的獨立集。M中點個數最多的稱爲最大獨立集
最大獨立集=最小路徑覆蓋=n-最大匹配數
例:(1,3),(3,4),(2,3),對於無向圖,可以得到兩種二分圖:
1.(1-3,4-3,2-3),求得最大匹配爲m=1,即爲最小頂點覆蓋數,最大獨立集=n-m
2.(1-3,3-1,4-3,3-4,2-3,3-2),求得最大匹配m=2,即爲最小頂點覆蓋數*2,最大獨立集=n-m/2
有向圖:
(1-3,2-3,3-4),最大匹配爲m=2,最小路徑覆蓋=n-m;