「MtOI2018」魔力环
首先发现是经典的循环置换本质不同个数模型,根据 Burnside 引理:
\]
考虑第 \(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\) 的关系:
\]
这本质上就是将 \(m\) 个黑珠子往 \(n - m\) 个白珠子里插的问题,考虑容斥,钦定有 \(i\) 段长度超过 \(k + 1\) 的黑珠子连续段,具体做法是将 \(k + 1\) 个黑珠子捆在一起插入到白珠子不同的 \(i\) 个缝隙中。由于黑珠子之间没有标号,那么忽略之前插入过的黑珠子,剩下的球随意插入到白珠子之间,那么有:
\]
同时根据前面的推导,可知计算一次 \(f(n, m)\) 的复杂度为 \(\mathcal{O}(m)\),根据一开始的 Burnside 引理,答案为:
\]
令 \(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\) 的黑球连续段的方案,还是有:
\]
对于 \(g\) 考虑 \(\rm dp\) 容斥转移,有初值 \(g(0) = g(1) = 1\),同时:
\]
那么最后一次填的是白球的方案就应该是 \(g(n - 1)\).
首先可以线性预处理出所有 \(0 \sim n\) 的 \(g\),然后直接按照上面哪个题的方法枚举约数计算,复杂度还是 \(\mathcal{O}(\sigma_1(n))\) 的。
当然也可以用上面的哪个方法再化简也可以得到这个复杂度,只不过细节有一点多
「MtOI2018」魔力环的更多相关文章
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
- 「2014-3-18」multi-pattern string match using aho-corasick
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...
- 「2014-3-17」C pointer again …
记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...
- 「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 =& ...
随机推荐
- 【ElasticSearch】异常 Request cannot be executed; I/O reactor status: STOPPED
Caused by: java.lang.RuntimeException: Request cannot be executed; I/O reactor status: STOPPED at or ...
- MobaXterm远程连接Linux图形用户界面
目标: 在自己的Windows桌面打开运行在Linux上的firefox浏览器, 使用MobaXterm终端工具在命令行直接打开图像化界面. 工具: Windows: MobaXterm Linux: ...
- Java 设置系统参数和运行参数
系统参数 系统级全局变量,该参数在程序中任何位置都可以访问到.优先级最高,覆盖程序中同名配置. 系统参数的标准格式为:-Dargname=argvalue,多个参数之间用空格隔开,如果参数值中间有空格 ...
- 解构插槽 Prop
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <link rel ...
- python 面向对象:类属性
一.概念和使用 类属性就是给类对象定义的属性 类属性用于记录与这个类相关的特征 类属性不会用于记录具体对象的特征 使用赋值语句在 class 关键字下方可以定义类属性 二.代码演示 示例需求: 定 ...
- vue 在实现关键字远程搜索时出现数据不准确的原因
实现通过输入关键字查询项目, 页面搜索规则框部分 js部分 之前通过在data中定义一个变量,然后在methods中filterFn方法获取当时输入的值去后台请求数据,然后把请求的数据存放在state ...
- vue - 指令创建 vue工程
1.在需要创建工程的文件夹里打开cmd 执行 vue -V 看看版本号是否正常, 创建工程 vue create [工程名称] 如:vue create mytestvue 然后会弹出选择 按方向键, ...
- Java定时调度
一.实现方式 Timer:单线程,串行: ScheduledExecutor:并行,论询,实现麻烦: Spring Scheduler:适合小任务: JcronTab:按照crontab语法编写的ja ...
- flutter之搭建环境
一. 环境搭建1.安装Flutter SDK 使用Flutter开发,首先我们需要安装一个Flutter的SDK. 下载Flutter的SDK 来到Flutter的官网网站,选择最新稳定的Flutte ...
- java集合对比汇总
List.Set和Map: List是有序的集合,Set是无序的集合.Map是无序的键值对. HashMap详解: HashMap有两个参数影响其性能:初始容量和加载因子.默认初始容量是16,加载因子 ...