Lightoj1134 poj3844 組合數學

2021-06-19 04:03:52 字數 1146 閱讀 6389

參考:

45

1 2 3 7 5

例如對於第一組資料,

1 2 3 7 5模上4分別是:

1 2 3 3 1

如果採用同餘+dp的方法,難度會相當大,規則比較複雜;

這時,我們採用一種巧妙地方法,就是用乙個sum[i]陣列來記錄前i個數之和%4,例如上例中,我們得到:i0(

該列隱含)

1234

5sweet[i]0

1237

5sum[i] 0

1 32 1

2 由此,我們在碰到1.sum[i] == 0 或者2.sum[i]的值已經在前面出現過的情況時,就可以知道有解,並且解是從上乙個出現該sum[i]數值的後乙個位置開始→現在sum[i]的位置,這個貌似可以解出可能的解;但由於加和的順序隨機,所以還不清楚是否可以在該case有解的情況下一定能夠解出解。這時候,我們就要用到鴿籠原理了。

運用《離散數學與組合數學》書中的方法,我們可以把sum[1~n=nneighbor](或0~n)看做n+1只鴿子(注意上面的隱含0列),飛入c=nchild個鴿籠中,再注意到題目中有這樣的資料範圍:

the first line of each test case contains two integerscandn(1 ≤c≤ n ≤ 100000) (這是本題能用鴿籠原理的最重要的前提)

由此我們可以知道一定有兩隻鴿子是飛入同乙個籠子當中的,所以加法的順序就自然不用考慮了;而且由這個我們也可以知道,此題一定不存在無解的情況

ac**如下:lightoj:

#include #include #include #include using namespace std;

int main()

ans += f[modsum];

if( modsum != 0 )

} cout << "case " << case++ << ": " << ans << endl;

}}

poj 1942 組合數問題

本題很簡單,但處理方法也很特殊,用double來存中間結果,神!同樣的公式,不同的處理方法,效果不同。如 選擇n時一定選小的,節約時間。處理階乘有三種辦法 1 傳統意義上的直接遞迴,n的規模最多到20 太小了,在本題不適用,而且非常慢 2 稍快一點的演算法,就是利用log 化乘為加,n的規模雖然擴充...

POJ 1850 1496 組合數學

poj 1496 word index poj 1850 code 題意 1.每個詞是自增的 2.同樣長度的詞是按字典序排練的 3.我們把這些詞標序 求某個詞的序號 分析 組合數學.推出公式然後用楊輝三角打錶出組合數,具體看 我還是太弱orz.1496 author illuz file 1496....

poj3252 組合數學

題意 給出乙個範圍,然後問這個範圍內有幾個是round number round number也就是轉化二進位制後,的個數大於等於 的個數 思路 這是乙個組合計數的問題 我們拿乙個二進位制長度為 的數舉例子 如果長度為 那麼所有長度為 以下的數字,肯定都是在範圍內的,那麼我們就要找出所有符合條件的數...