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))的做法?

    代码太丑不贴了……

  • 相关阅读:
    在Ubuntu下安装TensorFlow-gpu版本
    ubuntu安装和卸载软件命令
    Window7通过Anaconda安装Tensorflow
    Kaggle Titanic Data Science Solutions
    CNN、RNN和DNN的区别
    卷积神经网络介绍
    大数据随想
    golang omitempty 总结
    LeetCode 856 递归思路详解
    安装Nginx的各种报错的解决
  • 原文地址:https://www.cnblogs.com/ztc03/p/12014487.html
Copyright © 2011-2022 走看看