[USACO25OPEN] Moo Decomposition G

题目链接

洛谷

题目大意

有一个用长度为\(n\)的字符串\(T\)重复\(L\)次得到的字符串\(S\)(保证只由字符M和字符O组成)

要将\(S\)分割成若干个子序列(不一定连续),每个子序列都是一个字符M和\(k\)个字符O组成,求方案数(保证有解)

对\(10^9+7\)取模

解决方法

显然有一种\(O(nL)\)暴力做法:

考虑从后往前枚举位置

记遇到字符O的数量为\(cnt\),方案数为\(ans\)

如果遇到O,\(cnt=cnt+1\)

如果遇到M,\(ans\)会增加从\(cnt\)个中选\(k\)个的方案数,即\(ans=ans+C_{cnt}^{k}\),从\(cnt\)个中选\(k\)个匹配,\(cnt=cnt-k\)

考虑如何优化

注意到\(L\)个\(T\)之间不会互相影响,就是不会出现前一节的M匹配上后一节的O

证明:因为题目保证\(S\)有解,所以设\(S\)中一共有\(c1\)个M,那么就会有\(k\times c1\)个O,又因为有\(n\times L\)个字符,所以有\(n\times L-c1\)个O,所以

\[\begin{split} k\times c1&=n\times L-c1\\ \left(k+1\right)\times c1&=n\times L \end{split} \]

因为\(S\)一定由\(L\)个\(T\)组成,设一个\(T\)里有\(M\)个M,那么就会有\(n-M\)个O

\[\begin{split} \frac{\left(k+1\right)\times c1}{L}&=\frac{n\times L}{L}\\ \left(k+1\right)\times M&=n\\ k\times M&=n-M \end{split} \]

同时保证\(S\)有解,因此最后一个\(T\)一定能恰好拼成若干个MOO,也就是说最后一个\(T\)是恰好用完的,同理,倒数第二个\(T\)一直到第一个\(T\)也都是恰好用完的,不会存在前一个\(T\)的M匹配上后一个\(T\)的O,证明完毕

也就是说,只要你求出一个\(T\)的方案数(记为\(ans\)),那么每一个\(T\)都是在\(ans\)种配对方案中选一个,那么总方案数就是\(ans^L\)(使用快速幂可以做到\(log_2L\))

于是就能\(O(n+log_2L)\)求出答案了

posted on 2026-10-20 15:40  Qinluyan  阅读(3)  评论(0)    收藏  举报