首先发现是经典的循环置换本质不同个数模型,根据 Burnside 引理:

\[|X / G| = \frac{1}{|G|}\sum\limits_{g \in G} |X ^ g|
\]

考虑第 \(i\) 个置换,整个置换分为了 \((n, i)\) 个大小为 \(\frac{n}{(n, i)}\) 的循环置换,不动点数量就是每个循环置换内颜色全部相等的方案。

那么只需要考虑每个循环置换的第一个位置,即 \(1 \sim (n, i)\) 这些位置填的方案,剩下的按周期补齐即可。

此时对于第一个周期,他的长度为 \((n, i)\) 需要放的黑球恰好为 \(\frac{m(n, i)}{n}(\frac{n}{(n, i)} \mid m)\),注意需要满足整除的条件。

如果 \(n \ne m\),那么问题的约数条件就等价于将第一个周期首位相接后满足题目两个要求,此时周期之间互补影响。

否则整个环都必须要被涂黑,只需简单判定即可,以下默认 \(n \ne m\)。

于是我们记 \(f(n, m)\) 为将长度为 \(n\) 的环用恰好 \(m\) 个黑珠子,不存在长度超过 \(k\) 的黑珠子连续段的方案。

考虑去掉环的限制,枚举首尾极长黑珠子长度之和 \(l\),有 \(l + 1\) 种方案分配给首尾段,然后钦定首段后放了一个白球,尾端前放了一个白球,就变成了一个序列问题。

同时注意为了方便我们将 \(m \le k\) 的情况判掉(答案即 \(\binom{n}{m}\)),这样可以省去很多讨论。

据此,我们令 \(g(n, m)\) 将长度为 \(n\) 的序列用恰好 \(m\) 个黑珠子,不存在长度超过 \(k\) 的黑珠子连续段的方案,则有 \(f\) 与 \(g\) 的关系:

\[f(n, m) = \sum\limits_i ^ k (i + 1)g(n - i - 2, m - i)
\]

这本质上就是将 \(m\) 个黑珠子往 \(n - m\) 个白珠子里插的问题,考虑容斥,钦定有 \(i\) 段长度超过 \(k + 1\) 的黑珠子连续段,具体做法是将 \(k + 1\) 个黑珠子捆在一起插入到白珠子不同的 \(i\) 个缝隙中。由于黑珠子之间没有标号,那么忽略之前插入过的黑珠子,剩下的球随意插入到白珠子之间,那么有:

\[g(n, m) = \sum\limits_i ^ {\min(n - m + 1, \frac{m}{k + 1})} (-1) ^ i \binom{n - m + 1}{i} \binom{n - i * (k + 1)}{n - m}
\]

同时根据前面的推导,可知计算一次 \(f(n, m)\) 的复杂度为 \(\mathcal{O}(m)\),根据一开始的 Burnside 引理,答案为:

\[\frac{1}{n}\sum\limits_{i = 1} ^ n [\frac{n}{(n, i)} \mid m]f\left((n, i), \frac{m}{\frac{n}{(n, i)}}\right)
\]

令 \(d = \frac{n}{(n, i)}\) 那么 \(\frac{n}{d} \mid n, d \mid m\),则可知 \(d\) 的取值集合至多只有 \(m\) 的所有约数,因此复杂度的一个上界是 \(\mathcal{O}(\sigma_1(m))\).

一个经典的估界是 \(\sigma_1(m) = \mathcal{O}(m \log \log m)\) 因此可以轻松通过。


一个变式:原问题去掉黑球个数限制,可以填任意个黑球的方案。

同样的思路,求出 \(f(n)\) 为长度为 \(n\) 的环用若干个黑球,不存在长度超过 \(k\) 的黑球连续段的方案。

首先还是判掉 \(n \le k\) 的情况,此时 \(f(n) = 2 ^ n\).

更进一步地,还是令 \(g(n)\) 为长度为 \(n\) 的序列用若干个黑球,首尾必须填白球,不存在长度超过 \(k\) 的黑球连续段的方案,还是有:

\[f(n) = \sum\limits_i ^ k (i + 1)g(n - i)
\]

对于 \(g\) 考虑 \(\rm dp\) 容斥转移,有初值 \(g(0) = g(1) = 1\),同时:

\[g(i) = 2g(i - 1) - [i > k + 1]g(i - k - 2)(i > 2)
\]

那么最后一次填的是白球的方案就应该是 \(g(n - 1)\).

首先可以线性预处理出所有 \(0 \sim n\) 的 \(g\),然后直接按照上面哪个题的方法枚举约数计算,复杂度还是 \(\mathcal{O}(\sigma_1(n))\) 的。

当然也可以用上面的哪个方法再化简也可以得到这个复杂度,只不过细节有一点多

「MtOI2018」魔力环的更多相关文章

  1. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  2. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  3. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  4. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  5. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  6. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

  7. 「2014-3-18」multi-pattern string match using aho-corasick

    我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...

  8. 「2014-3-17」C pointer again …

    记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...

  9. 「2014-3-13」Javascript Engine, Java VM, Python interpreter, PyPy – a glance

    提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...

随机推荐

  1. Frp内网穿透搭建,家庭主机对外提供接口,支持ssh访问

    Frp内网穿透搭建,家庭主机对外提供接口,支持ssh访问 1.使用场景: 需求1.家中服务器 ubuntu 主机,跑接口服务,需要对外暴漏, 需求2.同时需要在外网ssh远程 ​ 关键词: frp内网 ...

  2. pandas tutorial 2

    @ 目录 Group_By 对数据进行分组 对 group进行迭代 选择一个group get_group() Aggregations 在group的基础上传入函数整合 Transformation ...

  3. Django项目部署到Apache服务器上

    之前写了把Django部署到XAMPP上,但是有bug,翻apache日志的时候发现会无法import _ssl,然后我就怒而直接装apache2了 配置方法大约和这篇文章差不多 安装必要的包 sud ...

  4. 在linux(deepin)系统下查看当前ip地址与用户名

    在linux(deepin)系统下查看当前ip地址与用户名 查看当前ip地址 方式一: hostname -I 方式二: ifconfig -a 如下图所示: 其中192.168.11.66即为当前系 ...

  5. Linux搜索查找类

    find find将从指定目录下递归地遍历各个子目录,将满足条件的文件或目录显示在终端,如果没有则不显示 基本语法 find 搜索范围 [选项] 选项说明 选项 功能 -name 按照文件名查找 -u ...

  6. Java初学者作业——定义管理员类(Admin),管理员类中的属性包括:姓名、账号、密码、电话;方法包括:登录、显示自己的信息。

    返回本章节 返回作业目录 需求说明: 定义管理员类(Admin),管理员类中的属性包括:姓名.账号.密码.电话:方法包括:登录.显示自己的信息. 实现思路: 分析类的属性及其变量类型. 分析类的方法及 ...

  7. 什么是NaN?它的类型是什么?如何可靠的测试一个值是否等于NaN?

    NaN属性表示"不是数字"的值.这个特殊值是由于一个操作数是非数字的(例如"abc"/4)或者因为操作的结果是非数字而无法执行的. 虽然看起来很简单,但是NaN ...

  8. nginx rewrite 基础

    一.跳转到首页  如果请求的页面不存在的话就跳转到首页 location / {      if (!-e $request_filename){        rewrite ^/(.*) /ind ...

  9. html 基础 vscode的常用快捷键

    1.ctrl+/ //注释代码 2.文件内容查找替换:ctrl+f ctrl+h ,替换一个ctrl+shift+1,替换所有ctrl+alt+enter 3.移动当前行,向上alt+up(方向键↑) ...

  10. MongoDB 安装及制作成windows服务

    下载:  注:直接使用浏览器下载速度很慢,建议使用其他下载软件下载(比如:迅雷) 官网下载地址: https://fastdl.mongodb.org/win32/mongodb-win32-x86_ ...