题目大意:给你(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))的做法?