【题解】魔力环

题目链接

题目大意:给你(m)个黑球,(n-m)个白球,要求把它们串成一个环(旋转后相同算同构,翻转后相同不一定同构),使得环上没有连续的一段黑球,其长度超过(k)。求方案数。

一点也不具体解法:

按照常规思路,首先将环从一个点切开。可以观察到构成的序列可能会出现循环。设其循环节长度为(p),则必有(p|gcd(m,n))

设序列长度为(k),则可以由(dp)算出长度为(k),第一个为白球的合法序列数。设由(i)个白球,(j)个黑球组成的、第一个为白球的合法序列数为(f_{i,j}),考虑相邻两个白球间隔为(d),则有(f_{i,j}=sum_{d=0}^mf_{i-1,j-d}),可以用多项式快速幂优化。

然而,显然这样会算重复。考虑由(i)个白球,(j)个黑球组成的、最小循环节为(i+j)的,以白球开始的序列数为(s_{i,j}),则(s_{i,j}=f_{i,j}-sum_{t|i,t|j}s_{frac it,frac jt})。可以对(forall d|n&&d|j),求出(f_{frac {n-m}d,frac md}),然后暴力枚举因数求出(s_{frac {n-m}d,frac md})

接着可以求出由(i)个白球,(j)个黑球组成的、最小循环节为(i+j)的本质不同的环数,即(frac {s_{i,j}}i),累加得到答案。

大概(O(nlog^2n))还是(O(nlog n))?反正可松过。

据说有(O(nloglog n))的做法?

代码太丑不贴了……

原文地址:https://www.cnblogs.com/ztc03/p/12014487.html