zoukankan      html  css  js  c++  java
  • 【题解】魔力环

    题目链接

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

    代码太丑不贴了……

  • 相关阅读:
    指针2
    学习笔记day3
    学习笔记day2
    学习笔记day1
    lighttpd启用支持IPv6
    GPL/widedhcpv6/dhcp6c源代码分析
    有多个vsftpd进程运行
    Java学习笔记day1
    python_day4
    python_day3.2
  • 原文地址:https://www.cnblogs.com/ztc03/p/12014487.html
Copyright © 2011-2022 走看看