
【OI】题解 AT4741 【[ABC132D] Blue and Red Balls】
首先,我们需要了解一个事实,这个事实对于解决这道题至关重要,那就是,我们如果要去取篮球,那么就得整个区间都取了。
也就是说,如果要取篮球,就得整块整块的取。形式化地说,就是若你要取篮球 ,且 都是篮球 (),那么就必须取 的所有篮球。
证明: 若取了一个篮球,而多取连续的一个,不会有多花费,那么不取白不取,肯定是取走一块优。
有了这样一个条件,那么"以最少的步数取走篮球" 意思其实是说 "每次取走连续一块篮球"。
所以,只需要看做将红球插入到篮球里就可以了。
易得答案
这怎么会是易得的呢?根本就不易得吧!那么我们就不要易得吧。不易得就要推导,现在我们就来推导一下。
首先,我们有 个篮球, 个红球, 要 次就是有 个连续的块,由我们前面得到的结论,我们如果要去取篮球,那么就得整个区间都取了就可以轻松得到。所以答案就是 ,是不是特别的有道理。
如果你还是没有明白,那么我们就不要这么直接了,首先,考虑有 个球放在那里,然后插入进去红球,就可以得到上式了。
如果数据大点,可以用费马小定理求个逆元然后再求组合数。
核心代码
int C(int m, int n) {
int ans = 1;
for (int i = 1; i <= m; i++) ans = (ans * (n - m + i) % mod * ksm(i, mod - 2) % mod) % mod;
return ans;
}