組合數學學習筆記

我會說這是個坑嗎算法

蒟蒻開始學組合數學了……數組

儘管我在認真,刷題速度和學習進度仍是要被大佬們甩好幾條街……ide

忙着刷題後期確定沒辦法寫總結,學習

就只好一邊學習一邊填坑啦啦啦。優化

^上面的都是廢話^spa


 

1、什麼是組合數學(徹底沒用,建議跳code

對於不少計數類問題blog

因爲方案數過於巨大,遞歸

咱們沒法用搜索的方式來解決問題 數學

所以咱們須要對計數類問題進行一些優化

這些優化就是組合數學研究的內容

:(沒錯就是研究計數類問題)

 


 

2、基本原理

加法原理:若是完成一件事有兩類方法,第一類方法有m1種方案,第二類方法有m2種方案,那麼完成這件事有m1+m2種方案 將方案分類,類類相加,而且要不重不漏

乘法原理:若是完成一件事有兩步,第一步有m1種方案,第二步方法有m2種方案,那麼完成這件事有m1*m2種方案 將方案分步,步步相乘 。

(這兩種原理都好說,稍加理解當即明白,如下的知識幾乎都要基於這兩種原理咕~)

 

 


 

 

3、排列與組合

:(弱小的主角

排列:從n個不一樣的元素中取出m(m≤n)個元素,按照必定的順序排成一列,叫作從n個不一樣元素中取出m個元素的一個排列

從n個數中取出m個數進行排列的方案數用符號A(n,m)表示

公式:A(n,m)=n*(n-1)*(n-2)*...*(n-m+1)=n!/(n-m)!

本身理解:第一個數字有n種選擇,第二個數字有(n-1)中選擇,以此類推,而後相乘

組合:從n個不一樣元素中取出m(m≤n)個元素的全部組合的個數,叫作從n個不一樣元素中取出m個元素的組合數 從n個數中取出m個數的方案數用符號C(n,m)表示

公式:C(n,m)=A(n,m)/A(m,m)=n!/(m!(n-m)!)

本身理解:每一種組合有A(m,m)種排列,因此每一種組合被這A(m,m)中排列算重了A(m,m)次,除掉就好啦

 


 

 

4、定理一籮筐(這東西纔是組合數學(死亡)的真諦啊)

歐幾里得算法:

這東西好說。展轉相除法。

一個式子基本上就涵蓋了:gcd(a,b)=gcd(b,a%b);

事實上裏面還有一點東西,就是和更相減損術一塊兒用來優化(我不知道我理解的對不對啊QAQ)

1.若x,y均爲偶數,則gcd(x,y)=2*gcd(x/2,y/2);

2.若x爲偶數,y爲奇數,則gcd(x,y)=gcd(x/2,y);

3.若x爲奇數,y爲偶數,則gcd(x,y)=gcd(x,y/2);

4.若x,y均爲奇數,則gcd(x,y)=gcd(x-y,y);

                  ——《信息學奧賽之數學一本通》

代碼不放啦~

懶的義正詞嚴

 

擴展歐幾里得算法:

蒟蒻我花了半個小時看了證實!(傻得無所畏懼,證實一共不到三行)

而後本身推了三遍終於爛熟於胸……(不只傻,並且笨……)

下面給出證實(保證默寫拒不翻書若有錯誤請大佬指正)

解丟番圖方程:ax+by=c

咱們先解ax+by=gcd(a,b);

(跟據裴蜀定理,ax+by=c僅當gcd(a,b)|c時有整數解)

ax+by=gcd(a,b)=gcd(b,a%b)=b*x+a%b*y=b*x+(a-a/b*b)*y=b*x+a*y-a/b*b*y=a*y+(x-a/b*y)*b

完。(注意上面用到的除都是整除啊~:5/2=2)

啥?你沒看懂?沒關係咱們把其中的兩個式子提出來看!

ax+by=gcd(a,b)=gcd(b,a%b)=b*x+a%b*y=b*x+(a-a/b*b)*y=b*x+a*y-a/b*b*y=a*y+(x-a/b*y)*b

這兩個式子是等價的!

因此咱們獲得回溯關係:x=y,y=x-a/b*y。

及:在遞歸求gcd中,回溯時x=y,y=x-a/b*y。

就是這樣啦啦啦~

 

inline int exgcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1,y=0;
        return a;
    }
    int d=exgcd(b,a%b,x,y);
    int tmp=x;
    x=y;
    y=tmp-a/b*y;
    return d;
}
>代碼在這裏!<

 

Lucas定理(蒟蒻嘗試着看證實結果被洗禮了……

Lucas是用來求C(n,m)%p的方法,時間複雜度挺低的,不過要求p爲質數。

給出式子:C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)%p

而後就遞歸下去。

遞推式:Lucas(n,m)%p=Lucas(n/p,m/p)*C(n%p,m%p)%p

好說,遞歸啊~

邊界顯然是m=0,return 1;

代碼回頭再放~(懶~)

蒟蒻趕忙繼續去看證實……

因此有了Lucas咱們就能夠寫下面這道題了:

「集合計數」

題目描述:從n個數的數列中取出若干個集合,要求這些集合的交集一共有k個元素,求取數方案個數。

題解:咱們先取出來k個數,讓剩下的數集合交集爲空集就好啦~

撕烤一下,直接讓他們交集爲空集好像很差實現。

剩下的n-k個數總共會組成2n-k個集合。這2n-k個集合取或不取又能組成22n-k種取集合的方案。

因此咱們枚舉交集元素爲k到n,容斥就好啦~

 


 

 

5、基本數學方法:(轉自PPT)

1、特殊元素和特殊位置優先策略(有時須要注意分狀況)

由0,1,2,3,4,5能夠組成多少個沒有重複數字的五位奇數

解:因爲末位和首位有特殊要求,

應該優先安排,

以避免不合要求的元素佔了這兩個位置。

先排末位共有C(3,1),而後排首位共有C(4,1),最後排其它位置共有A(4,3)

由分步計數原理得C(3,1)C(4,1)A(4,3)

2、相鄰元素捆綁策略(不要忽略捆綁元素內部排列!)

7人站成一排 ,其中甲乙相鄰且丙丁相鄰,共有多少種不一樣的排法.

解:先將甲乙兩元素捆綁成總體並當作一個複合元素,

同時丙丁也當作一個複合元素,

再與其它元素進行排列,

同時對相鄰元素內部進行自排。

由分步計數原理可得共有A(5,5)A(2,2)A(2,2)種不一樣的排法。

3、不相鄰問題插空策略(注意特殊狀況:詳見題解[排隊])

一個晚會的節目有4個舞蹈,2個相聲,3個獨唱,舞蹈節目不能連續出場,則節目的出場順序有多少種?

解:分兩步進行 第一步,排列2個相聲和3個獨唱,共有A(5,5)種方案

第二步,將四種舞蹈插入第一步排好的5個元素中間包含首尾兩個空位A(6,4)共有種不一樣的方法,

節目的不一樣順序共有A(5,5)A(6,4)種。

4、定序問題倍縮空位插入策略

7人排隊,其中甲乙丙3人順序必定,共有多少不一樣的排法 (倍縮法)

對於某幾個元素順序必定的排列問題,

可先把這幾個元素與其餘元素一塊兒進行排列,

而後用總排列數除以這幾個元素之間的全排列數,

則共有不一樣排法種數是A(7,7)/A(3,3)

5、排列問題求冪策略

把6名實習生分配到7個車間實習,共有多少種不一樣的分法

解:完成此事共分六步:

把第一名實習生分配到車間有7種分法,

把第二名實習生分配到車間也有7種分法

依此類推,

由乘法原理共有7^6種不一樣的排法。

6、環排問題轉化成線排策略

8人圍桌而坐,共有多少種坐法?

解:圍桌而坐與坐成一排的不一樣點在於,

坐成圓形沒有首尾之分,

因此固定一人,並今後位置把圓形展成直線其他7人共有(8-1)!=7!種排法

7、多排問題轉化成直排策略

8人排成先後兩排,每排4人,其中甲乙在前排,丙在後排,共有多少排法

8人排先後兩排,至關於8人坐8把椅子,

能夠把椅子排成一排。

前排有2個特殊元素,

方案數爲A(4,2) 後4個位置上有一個特殊元素丙,

方案數爲A(4,1) 其他的5人在5個位置上任意排列,

方案數爲A(5,5) 共有A(4,2)A(4,1)A(5,5)種方案

8、排列組合混合問題先選後排策略

有5個不一樣的小球,裝入4個不一樣的盒內,每盒至少裝一個球,求共有多少不一樣的裝法

第一步從5個球中選出2個組成複合元共有C(5,2)種方法.

再把4個元素(包含一個複合元素)裝入4個不一樣的盒內有A(4,4)種方法

根據分步計數原理裝球的方法共有C(5,2)A(4,4)。

9、平均分組問題除法策略

6本不一樣的書平均分紅3堆,每堆2本共有多少分法

分三步取書得C(6,2)C(4,2)C(2,2)種方法,

但這裏出現重複計數的現象

每種方案計算了A(3,3)次,

故最終答案爲C(6,2)C(4,2)C(2,2)/A(3,3) 

10、重排列

由四面紅旗,三面藍旗,二面黃旗,五面綠旗排成的一排彩旗有多少種?

將14面彩旗排成一個排列,方案數A(14,14) 其中紅旗之間每種排列等價,

方案數A(4,4) A(14,14)/(A(4,4)A(3,3)A(2,2)A(5,5))


 6、求逆元(求組合數要用逆元QAQ)

求逆元是一個痛苦的回憶……

不只賊難求並且不一樣狀況下用於求逆元的方法還不同……

 


 

0x7fffffff:簡單的組合問題(蒟蒻我在認真推式子QAQ~)

T1:記者要爲5名志願者和他們幫助的2位老人拍照,要求排成一排,2位老人相鄰但不排在兩端,求不一樣排法的數量。

解:兩名老人捆綁(怪怪的……我不是壞人QAQ),

五名志願者排列A(5,5),兩名老人排列A(2,2),

將兩名老人的總體插入到4個空隙中A(4,1)(不能在兩邊)。

960。

T2:用0到9這10個數字,能夠組成多少個沒有重複數字的三位偶數?

解:末尾必定爲偶數,共有五種選擇。首位不能爲零。

分類討論:

(1).若是末尾不爲零,

末尾有四種選擇,爲C(4,1),首位除去零有八種選擇,爲C(8,1),中間有餘下的八種選擇,C(8,1)。

相乘得:256。

(2).若是末尾爲零

末尾有一種。首位有九種選擇,C(9,1),中間有餘下的八種,C(8,1),

相乘得:72。

最後兩種狀況相加:328。


0xffffffff:吾誤唔,嗚嗚嗚……

T1排隊:一直w90……不知道爲啥……尤爲是全部樣例不管是手模的仍是用題解yy出來的都沒毛病。

最後Larry大神幫我對拍(我應該本身對拍的……我懺悔……)發現有些點個人代碼不輸出,正解是零。

檢查代碼發現答案數組c[0]記錄長度,最後的時候無下限狂減減沒了……改掉後就A了……+7,我想死怎麼辦……

T2perm排列計數:這道題稍微噁心,我就不是人了……

交了六遍才A掉。。。原本打算一遍A的,可是一直TLE82。。。3000多毫秒,對比了一下大神的294毫,我想去死。。。

而後諮詢了一下動動神佬,動動神佬說:打表啊~ 我:……

(我會說我一開始連表都沒打對嗎?順便提一句,腦殘的我在輸入p以前就調用了p打表結果表裏全是0……

取模了一下,浮點數例外就出來了。不過令我欣慰痛心的是,機房裏諸多大佬居然都死在這個坑裏,光來問個人就有五六個。。。)

A掉,700毫秒。坦然了,這個世界沒有真理可言……

時限苦短,及時打表啊~

T3:集合計數:拿到這道題一臉懵比(彷佛蒟蒻我拿到啥題都能一臉懵比……)因此不是人了……

發現集合計數要想補集。補集……很不幸,又出現了重複的問題。因而又用到了容斥……

容斥挺好打,然而sb的我沒想到他會容斥成負……70分調了我兩個小時。最後看lsc大神題解這才掙扎出來……

我太菜了……我是sb蒟蒻……

相關文章
相關標籤/搜索