AtCoder Beginner Contest 266 G 题解

直接利用组合数求解的做法比较简单,这里就不再赘述,着重讲利用二项式反演的做法。

首先不难想到用 ii 个 RG,rir - i个 R,gig-i个 G,bb个 B 排,得到看似是“至少有ii的 RG”的字符串数量。但是这样计数会有重复,比如RG B R GR G B RG其实是一样的串但计数的时候算了两次,准确地说,含jj个 RG 的串被重复记了(ji)j\choose i次,用数学语言表示就是:设f(x)f(x)为恰好含xx个 RG 的字符串的数量,有 (i+ri+gi+b)!i!(ri)!(gi)!b!=j=imin(r,g)(ji)f(i)\frac{(i + r - i + g - i + b)!}{i!(r - i)!(g - i)!b!} = \sum_{j = i}^{\min(r, g)}{j \choose i}f(i)

这恰好是二项式反演的形式二,那么答案f(k)f(k)f(k)=i=kmin(r,g)(1)ik(ik)(i+ri+gi+b)!i!(ri)!(gi)!b!f(k) = \sum_{i = k}^{\min(r, g)}(-1)^{i - k}{i \choose k}\frac{(i + r - i + g - i + b)!}{i!(r - i)!(g - i)!b!}