[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)\)求出答案了
浙公网安备 33010602011771号