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;

相关文章
相关标签/搜索