設有若干個物品以及\(k\)種屬性,每個物品都有若干種屬性。
設有函式\(f(s)\)表示至少擁有屬性集合\(s\)的物品個數
參考乙個很簡單的\(k=3\)的情況
每種顏色的圓的物品集合都擁有同乙個屬性,圓外面是沒有屬性的物品,設全集\(u\)為所有屬性的集合。
一般來說,我們要求三個圓面積的交。
形式化的說,我們要求至少擁有一種屬性的物品的集合大小,也就是有屬性的物品有多少個。
公式說,這個集合大小為
\[\sum_f(s) \times (-1)^
\]說白了在\(k=3\)就是乙個圓公共-兩個圓公共+三個圓公共,大家都知道。
考慮乙個正經的證明。
大體思路:證明每個有屬性的物品的計算次數是\(1\)
設有乙個\(p\)種屬性的物品,考慮哪一些集合會出現\(ta\)
每種大小不大於\(p\)的集合都可能對\(ta\)有貢獻,即為
\[\sum_^ \binom \times (-1)^
\]通過組合數學 \(\binom = \binom + \binom\)的這個公式,我們化簡一下上面的式子,就等於\(1\)啦。
設有多重集\(\\),\(x\)是元素的值,而\(c\)是這個值的個數,設\(c=\sum\limits_^k c_i\)。
先考慮多重集的排列數,顯然為
\[\frac^k c_i!}
\]假設現在要取\(n\)個元素。
首先我們不考慮每種元素的上限時(也就是當每種元素都有無限個的時候)的方案數
從組合的意義出發,相當於把\(n\)個元素有序的劃分成\(k\)組,每組可以為空的方案數。
等價於\(n\)個\(0\),\(k-1\)個\(1\)的排列數,由多重集的排列數,為
\[\frac=\binom
\]然後我們考慮至少有一種元素取多了的方案數
考慮\(x_i\)取了至少\(c_i+1\)個的方案數,首先我們把這\(c_i+1\)個取出來,然後再隨便取,為\(\binom\)
則至少某一種元素取多了的方案數為
\[\sum_^\binom
\]模擬可以得到至少兩種元素取多了的方案數等等
如果把多取了某個元素當做乙個屬性,每一種取法當做物品,那麼就可以套用上面的容斥原理了。
即為\[\sum_^\binom-\sum_^\binom+\dots+(-1)^\cdot\sum_^\binom
\]上式代表的是至少某一種元素取多了的方案數,形象化的說,代表那三個圓的面積交。
則總方案為無限制的多重集的總排列數(全集)減去至少某乙個元素多取了個數的方案數(面積並)
注意我們求解這個的複雜度是至少要列舉\(2^k\)種分配情況的,所以\(k=20\)左右時再想一想是不是這個做法。事實上還可以\(f_\)代表前\(i\)種集合選了\(j\)個元素進行\(dp\)做。
乙個\(a \times b\)的矩形,每個位置的值在整數\([0,s]\)中,要求每行每列的最大值均為\(s\),計算有多少取值的方案。設\(f_i\)為至少有\(i\)行的限制不滿足條件時的方案(需要保證每一列都滿足條件)
\(f_i=\binom \times(s^i \times ((s+1)^-s^))^b\)
方案數就是\(\sum\limits_^a (-1)^i \times f_i\)。
先解釋\(f_i\),如下圖,藍色的部分為滿足的行,黃色的為不滿足的行。
我們一列一列的填,把保證列滿足的條件放在藍色的地方。
於是藍色的地方有總填法方案數\((s+1)^\)減去每一行都不填最大值的方案數\(s^\)得到至少有乙個位置填了\(s\)的方案數。
然後黃色的地方每個位置只能填\([0,s-1]\),於是是\(s^i\)種填法了。
對每一列都這麼填,於是是\(b\)次方,然後列舉哪\(i\)行不滿足,就是\(f_i\)了。
然後是後面的容斥,不知道你有沒有發現,上面兩個地方出現了至少都是加黑的,還有一處是斜體,這是為了警示和區分,反正我想了好久才明白。
有沒有覺得 \(\text\)
事實上這樣說沒問題,但是這個「至少」和\(f_i\)中的「至少」的意義並不一樣。
可以像求多重集的組合數一樣把意義套到容斥裡面,然後結合上面的斜體和黑體的為什麼不一樣理解一下,就可以明白區別在**了。
長期更新...
一些經典的容斥問題
求三角形的個數比較簡單。首先全集是 binom 然後考慮補集,補集就是三點共線的點對。所以我們可以列舉每乙個點,然後為了避免算重,我們接下來只考慮標號比當前點小的點。接著就進行極角排序,這樣就可以統計出當前點所在的所有直線以及直線上的點的個數。設某直線上有 m 個點,那麼答案就減去 binom 即可...
有關鉤子的一些東西
前段時間開始轉型用vc7寫東西,做了些東西,感覺vc7的智慧型感應確實比vc6要好用很多,某天,打算用vc7做個鉤子程式,於是先把以前用vc6做的乙個程式在vc7裡重寫一遍,結果一呼叫就提示嚴重錯誤.很奇怪,看了看鉤子的那個類,似乎沒什麼錯,在裝鉤子的函式裡加了個messagebox,再呼叫,發現可...
天上的星星 容斥原理)
在乙個星光摧殘的夜晚,蒜頭君一顆一顆的數這天上的星星。蒜頭君給在天上巧妙的畫了乙個直角座標系,讓所有的星星都分布在第一象。天上有 nn 顆星星,他能知道每一顆星星的座標和亮度。現在,蒜頭君問自己 qq 次,每次他問自己每個矩形區域的星星的亮度和是多少 包含邊界上的星星 輸入格式 第一行輸入乙個整數 ...