首先发现是经典的循环置换本质不同个数模型,根据 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. 【python】PyQt5 QAction 添加点击事件

    def test(): #your function ui.yourQActionName.triggered.connect(lambda:test()) #添加lambda: 就不报错了

  2. Boosting Adversarial Training with Hypersphere Embedding

    目录 概 主要内容 代码 Pang T., Yang X., Dong Y., Xu K., Su H., Zhu J. Boosting Adversarial Training with Hype ...

  3. Java初学者作业——输入一个五位数字,计算各位数字之和并输出,运行结果为五个数字之和(实践2)

    返回本章节 返回作业目录 需求说明: 编写Java程序,输入一个五位数字,计算各位数字之和并输出,运行结果为五个数字之和. 实现思路: (1)声明变量num,用于存储用户输入的数字. (2)通过Sca ...

  4. Eclipse+Maven+JDK+tomcat搭建java的开发环境

    由于最近有几个同事都在学习java方面的东西,所以我写个博文做下笔记,其中遇到过很多个坑,这里就不多说了 首先,我用的是Eclipse+Maven的组合,用Ecplise是周边java开发的同事用这个 ...

  5. Python_jsonPath模块的使用

    jsonpath简介 如果有一个多层嵌套的复杂字典,想要根据key批量提取value,还是比较繁琐的.jsonPath模块就能解决这个痛点,接下来我们来学习一下jsonpath模块. 因为jsonpa ...

  6. Hive实现网站PV分析

    原文链接: https://www.toutiao.com/i6773241257528394248/ 之前我们做过<java mapreduce实现网站PV分析>,这次我们可以用hive ...

  7. spring boot 中使用swagger

    一.pom.xml <dependency> <groupId>io.springfox</groupId> <artifactId>springfox ...

  8. vue-json-editor可视化编辑器的介绍与应用

    vue-json-editor可视化编辑器 最近项目中有用到json编辑器,我选用了这款vue的编辑器,看起来也是比较简洁,接下来就具体介绍一下它,以及内部属性. 一.vue-json-editor的 ...

  9. 一键AI着色,黑白老照片画面瞬间鲜活

    很多老照片或者电影受时代技术所限制,只能以黑白形式保存:经过编辑后的黑白视频和图片早已丢失彩色原图,这对于保存者来说都十分遗憾.如何能将单一乏味.陈旧斑驳的黑白照片变成鲜活亮丽的彩色照片,从照片中重新 ...

  10. 图解GNN:A Gentle Introduction to Graph Neural Networks

    1.图是什么? 本文给出得图的定义为:A graph represents the relations (edges) between a collection of entities (nodes) ...