TCO'10 Wildcard Round 1000pt

題目大意:app

給定一個N*M的棋盤,棋子能夠攻擊其左右距離不超過K的棋子。問有多少种放法使得棋盤上的棋子不能互相攻擊。code

N,M,K都在1到1000000000的範圍內,結果對100003取模。get

官方題解:top

http://apps.topcoder.com/wiki/display/tc/TCO'10+Wildcard+Rounddi

解題思路:co

這題行與行之間沒有關係是從一開始就之間看的出來的,因此只要求出一行的種數就能搞定該題。display

假設一行有W個格子中放r個棋子,使得r個棋子之間的距離都超過K,作法是先所有任意的放進去,而後再往每一個棋子(除了最右邊的那個)右面插入K個棋子,這樣就能保證棋子與棋子之間距離超過K,可是會使棋盤增長(r-1)*K個棋子,因此一開始就把多出來的格子減掉就能夠了,因此放的方案數是C[W-(r-1)*K][r];其實這題考慮的是棋子之間的距離都要超過K,換一種約束,若是第i個棋子與第i+1個棋子之間的距離要超過Ki,這樣也是沒問題的,設sum=sigma(Ki),i<r,則所的方案數爲C[w-sum][r];cas

固然組合數可能很大,而後要用Lucas定理來計算,因而收穫了一份預處理版的Lucas定理。ps

這題比較無語的地方是當K比較小的時候,必須用矩陣連乘作,當K大的時候,必須用組合數作,二者要定一個界,定很差就超時。超時

代碼:

見官方題解就OK;

相關文章
相關標籤/搜索