《introductory combinatorics fifth edition》學習筆記:
四個基本計數原理:
@加法原理:設集合s劃分為兩兩互不相交的各個部分s1,s2,s3……sn,那麼s的元素總個數等於各個部分的總個數之和。即|s|=|s1|+|s2|+……+|sn|.(如果允許子部分相交,則需要用容斥原理來解決)使用加法原理的技巧是:把原集合分割成容易處理的少量子集。
例子:一名學生想要選修一門數學課程和一門計算機的課程,數學課程有三門可供他選擇,計算機課程有四門可以選擇,那麼該學生有多少種選擇?
s=s1+s2=3+4=7
@乘法原理:設s是有序對(a,b)的集合,a來自大小為p的集合s1,對於每乙個a都有q個不同的b元素和其對應。於是|s|=p*q
例子:確定乙個正整數的正因子的總個數?
分析:乙個正整數可以進行唯一的素因子分解,比如12=2^2*3,那麼12的正因子為2的指數總個數和3的指數總個數之積;3*2=6.
#include #include#includeusing namespace std;
typedef long long ll;
const int maxn=1e8+1,maxn2=1e7;
int pri[maxn2],top=0,pow[maxn2];
bool notpri[maxn];
void getpri(),稱a'是a在u中的補集。|a|=|u|-|a'|.
例子:有多少個各位數字互不相同且不為0的兩位數?
用乘法原理做:9*8=72.
減法原理做:兩位數字一共有90個(99-9=90),存在位數有0的有(10,20……90)9個,位數相同的兩位數有(11,22,33……99)9個,所以滿足條件的一共有90-9-9=72個。
@除法原理:如果知道了s中的物件數目以及各部分所含物件數目的共同值,就可以確定部分的數目。k=|s|/|s(k)|.
例子(嚴格的說是排列的例子): 數字1,1,1,3,8能夠構造多少個不同的5位數?
s=a(5,5)/a(3,3)=5*4=20.(用乘法原理同樣能分析出來)
C 的四個基本技巧
1 如果可能盡量使用介面來程式設計 net框架包括類和介面,在編寫程式的時候,你可能知道正在用.net的哪個類。然而,在這種情況下如果你用.net支援的介面而不是它的類來程式設計時,會變得更加穩定 可用性會更高。請分析下面的 private void loadlist object items,li...
C 的四個基本技巧
1 如果可能盡量使用介面來程式設計 net框架包括類和介面,在編寫程式的時候,你可能知道正在用.net的哪個類。然而,在這種情況下如果你用.net支援的介面而不是它的類來程式設計時,會變得更加穩定 可用性會更高。請分析下面的 private void loadlist object items,li...
C 的四個基本技巧
1 如果可能盡量使用介面來程式設計 net框架包括類和介面,在編寫程式的時候,你可能知道正在用.net的哪個類。然而,在這種情況下如果你用.net支援的介面而不是它的類來程式設計時,會變得更加穩定 可用性會更高。請分析下面的 private void loadlist object items,li...