组合数学 —— 基本计数原理
【抽屜原理】
1.內(nèi)容
把 n+1 件東西放入 n 個抽屜,則至少有一個抽屜里放兩件或兩件以上的東西。
從令一角度說,把 n-1 件東西放入 n? 個抽屜,則至少一個抽屜是空的。
2.經(jīng)典應(yīng)用
給出一個含有 n 個數(shù)字的序列,要找一個連續(xù)的子序列,使他們的和一定是 c 的倍數(shù)
假設(shè) sum[i] 存儲整數(shù)序列中的前 i 項和
根據(jù)抽屜原理,以 sum 數(shù)組構(gòu)造抽屜 drawer 數(shù)組,其保存的是最先出現(xiàn)的 sum[i] 的下標,當 sum 的一個元素第二次放入重復(fù)的抽屜時,輸出結(jié)果。
若 sum[i] 是 c 的倍數(shù),直接輸出前 i 項即可,若 sum[i] 不是 c 的倍數(shù),則需要計算 sum[i]%c,此時,sum[i]%c = sum[j]%c,i!=j 肯定存在,即第 j 到第 i 項數(shù)的和為 c 的倍數(shù)。
LL a[N],drawer[N]; LL sum[N]; int main(){LL c,n;while(scanf("%lld%lld",&c,&n)!=EOF&&c&&n){memset(drawer,-1,sizeof(drawer));drawer[0]=0;sum[0]=0;for(LL i=1;i<=n;i++){//計算前綴和scanf("%lld",&a[i]);sum[i]=sum[i-1]+a[i];}for(LL i=1;i<=n;i++){if(drawer[sum[i]%c]!=-1){for(LL j=drawer[sum[i]%c]+1;j<i;j++)printf("%lld ",j);printf("%lld\n",i);break;}drawer[sum[i]%c]=i;}}return 0; }【加法原理與乘法原理】
1.分類加法原理
做一件事,完成它有 n 類方式,第一類方式有 M1 種方法,第二類方式有 M2 種方法,…,第 n 類方式有 Mn 種方法,那么完成這件事共有 M1+M2+……+Mn 種方法。
例如:從北京到上海有火車、飛機、輪船 3 種方式,火車、飛機、輪船分別有 k1,k2,k3 個班次,那么從北京到上海有 k1+k2+k3 種方式可以到達。
2.分步乘法原理
做一件事,完成它要分成 n 個步驟,第一步有 M1 種不同的方法,第二步有 M2 種不同的方法,…,第 n 步有 Mn 種不同的方法,那么完成這件事共有 M1×M2×M3×…×Mn 種不同的方法。
例如:從北京乘坐火車到上海,需要轉(zhuǎn) 3 次車,每次專車分別有 k1,k2,k3 個班次,那么從北京到上海有 k1×k2×k3 種方式可以到達。
3.聯(lián)系
分類加法原理和分步乘法原理是兩個基本原理,回答的都是有關(guān)做一件事的不同方法種數(shù)的問題。
兩者區(qū)別在于:分類計數(shù)原理針對的是分類問題,其中各種方法相互獨立,用任何一種方法都可以完成這件事;分步計數(shù)原理針對的是分步問題,各步驟中的方法相互依存,只有各個步驟都完成才算完成事情。
分類要依據(jù)同一標準劃分,既必須包括所有情況,又不要交錯在一起產(chǎn)生重復(fù);分步則應(yīng)使各步依次完成,保證整個事件得到完成,既不得多余重復(fù),也不缺少某一步驟。
【應(yīng)用】
根據(jù)研究對象的有無,一般將組合數(shù)學(xué)分為排列問題和組合問題。
其根本不同是排列問題與元素順序有關(guān),組合問題與元素順序無關(guān)。
在排列與組合問題中,經(jīng)常會出現(xiàn)計數(shù)問題,解決計數(shù)問題的思路一般有以下三種:
1)只取需要的。將各種符合條件的情形枚舉出來,再利用加法原理求和。
2)先取后排。將各步符合條件的排列或組合計算出來,再根據(jù)乘法原理求積。
3)先全部取,再減去不要的。利用容斥定理,將各種符合條件的情形枚舉出來,再減去不符合條件的。
關(guān)于容斥定理:點擊這里
【例題】
總結(jié)
以上是生活随笔為你收集整理的组合数学 —— 基本计数原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 装箱问题(信息学奥赛一本通-T1295)
- 下一篇: 删数问题(信息学奥赛一本通-T1321)