音乐播放器
chu_K's blog
 
文章 标签
22 9

Powered by Gridea | Theme: Fog
载入天数...
载入时分秒...
御风飞行中...

【OI】题解 AT4741 【[ABC132D] Blue and Red Balls】

首先,我们需要了解一个事实,这个事实对于解决这道题至关重要,那就是,我们如果要去取篮球,那么就得整个区间都取了。

也就是说,如果要取篮球,就得整块整块的取。形式化地说,就是若你要取篮球 ii ,且 jkj\rightarrow k 都是篮球 (jikj \le i \le k),那么就必须取 jkj \rightarrow k的所有篮球。

证明: 若取了一个篮球,而多取连续的一个,不会有多花费,那么不取白不取,肯定是取走一块优。

有了这样一个条件,那么"以最少的步数取走篮球" 意思其实是说 "每次取走连续一块篮球"。

所以,只需要看做将红球插入到篮球里就可以了。

易得答案 Cni×Ci1k1C_n^i\times C_{i-1}^{k - 1}

这怎么会是易得的呢?根本就不易得吧!那么我们就不要易得吧。不易得就要推导,现在我们就来推导一下。

首先,我们有 nn 个篮球, nkn-k 个红球, 要 ii 次就是有 ii 个连续的块,由我们前面得到的结论,我们如果要去取篮球,那么就得整个区间都取了就可以轻松得到。所以答案就是 (in)×(i1k1)\binom{i}{n} \times \binom{i-1}{k-1},是不是特别的有道理。

如果你还是没有明白,那么我们就不要这么直接了,首先,考虑有 nn 个球放在那里,然后插入进去红球,就可以得到上式了。

如果数据大点,可以用费马小定理求个逆元然后再求组合数。

核心代码

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;
}