TCO'10 Wildcard Round 1000pt

本文深入解析了一个涉及棋盘布局与棋子攻击距离限制的数学问题,通过构建行间独立性,简化了求解过程。引入组合数学中的Lucas定理,并提供了一种高效解决方法,特别针对不同K值优化了解决策略。同时,展示了通过矩阵连乘和组合数计算在不同场景下的应用,确保了解决方案的灵活性与效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

给定一个N*M的棋盘,棋子可以攻击其左右距离不超过K的棋子。问有多少种放法使得棋盘上的棋子不能互相攻击。

N,M,K都在1到1000000000的范围内,结果对100003取模。

官方题解:

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

解题思路:

这题行与行之间没有关系是从一开始就之间看的出来的,所以只要求出一行的种数就能搞定该题。

假设一行有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];

当然组合数可能很大,然后要用Lucas定理来计算,于是收获了一份预处理版的Lucas定理。

这题比较无语的地方是当K比较小的时候,必须用矩阵连乘做,当K大的时候,必须用组合数做,两者要定一个界,定不好就超时。

代码:

见官方题解就OK;

转载于:https://www.cnblogs.com/Fatedayt/p/3195686.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值