首先发现这题虽然是边的置换,但是是由点的置换所造成的,并且发现点置换对应的所有边置换和置换操作构成置换群。

由于颜色可以全选,那么根据 Polya 定理,答案为:

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

注意到不同点的置换对应边置换不同,那么只需要考虑每个点置换对应边置换的贡献之和。

对于一个点置换,发现一个点循环置换内部导出子图的边一定置换到另一条也在导出子图当中的边,因此考虑分边循环置换是否在导出点循环置换导出子图内部来分类。

  • 一个点循环置换内部(大小为 \(L\))导出子图边循环置换个数为 \(\frac{L}{2}\).

以长度 \(c\) 为周期与长度 \(L - c\) 为周期本质相同。

  • 两个点循环置换导出子图之间的边置换后还在这两个点循环置换导出子图之间,并且有 \(\frac{L_1L_2}{\mathrm{lcm}(L_1, L_2)} = (L_1, L_2)\) 个边循环置换。

考虑任意一条此位置的边循环 \(\mathrm{lcm}(L_1, L_2)\) 次之后就会回到这条边。

因此对于一个循环置换大小为 \(a_1, a_2, \cdots a_k\) 的点循环置换,它的贡献为:

\[\sum\limits_{i = 1} ^ k \lfloor \frac{a_i}{2} \rfloor + \sum\limits_{i < j} (a_i, a_j)
\]

注意到数据范围较小,且只需要搜索所有划分数,因此可以直接爆搜通过。

需要注意的是,令 \(c_i\) 为大小为 \(i\) 的数选了 \(c_i\) 个,那么一种划分对应点循环置换个数为:

\[\frac{n!}{\prod\limits_{i = 1} ^ k a_i!c_i!} \prod\limits_{i = 1} ^ k (a_i - 1)! = \frac{n!}{\prod\limits_{i = 1} ^ k a_ic_i!}
\]

需要注意一些实现上的问题,比如一定要保证每一轮搜索结束都能恰好搜到一个划分,不然复杂度是划分数前缀和的,具体方法就是从大往小搜,搜到 \(1\) 的时候强制填满。

同时需要注意每次搜索不要经过不填入划分当中的数,每次枚举下一个填的数是什么。

同时每次只考虑填入多少个数来减小贡献的计算,这样至少能保证每个划分数计算的次数只有 \(len(p) \le \sqrt{n}\) 次(\(len(p)\) 为划分 \(p\) 当中本质不同的数的个数)

然后如果边填数边计算贡献,原本计算单个划分数的复杂度就可以均摊到何其前缀相同的每个划分数上,这样复杂度就是 \(\mathcal{O}(p(n))\) 其中 \(p(n)\) 为 \(n\) 的划分数。

下面这份代码大概能在 \(1s\) 内跑完 \(80\).

代码

同时贴一份划分数本质不同个数次幂和的表:这里

「SHOI2006」有色图的更多相关文章

  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. isEmpty 和 isBlank

    <org.apache.commons.lang3.StringUtils> isEmpty系列 StringUtils.isEmpty() ========> StringUtil ...

  2. SOFA 数据透析

    数据透传: 在 RPC调用中,数据的传递,是通过接口方法参数来传递的,需要接口方定义好一些参数允许传递才可以,在一些场景下,我们希望,能够更通用的传递一些参数,比如一些标识性的信息.业务方可能希望,在 ...

  3. Color Models (RGB, CMY, HSI)

    目录 概 定义 RGB CMY CMYK HSI 相互的转换 RGB <=> CMY CMY <=> CMYK CMY > CMYK CMYK > CMY RGB ...

  4. JavaScript交互式网页设计 • 【第6章 初识jQuery】

    全部章节   >>>> 本章目录 6.1 jQuery概述 6.1.1 初识 jQuery 6.1.2 jQuery 基本功能 6.1.3 搭建 jQuery 开发环境 6.1 ...

  5. Java集合与数组的联系和区别

    数组特点 存放一组相同的数据类型(基本类型和对象类型)的数据,从而实现对数据的管理. 优势:可以快速的通过下标对数组元素进行访问,效率高 劣势:容量实现定义好了,不能随着需求变化而扩容. 集合特点 集 ...

  6. Eclipse导入Zookeeper源码Version2017.11.3

    将Zookeeper源码导入Eclipse, Zookeeper源码需要使用ant构建后才能导入Eclipse, 和Solr的源码一样也是使用ant构建的, 大部分可以参考Eclipse导入Solr源 ...

  7. Swoole 中使用 HTTP 异步服务器、HTTP 协程服务器

    HTTP 异步风格服务器 # http_server.php $http = new Swoole\Http\Server("0.0.0.0", 9501); // 设置服务器运行 ...

  8. C# 使用vs2017 创建类 时 注意点

    1.创建新类后,在其他类无法new 这个新创建的类 ,怎么回事? 原因很简单,创建类时不带修饰符,默认是被保护的类 上图为创建类后的默认代码 ,没有修饰符 ,在其他类中无法引入改类的命名空间,会显示找 ...

  9. centos7 单用户模式修改root密码

    1. 在虚拟机重启客户机后.会出现下面进入界面.按e键 2.按了e键后,会出现下面的界面.此时按↓键.找到linux16 3.将光标移动到UTF-8后面,添加init=/bin/sh,并按 ctrl  ...

  10. 异常 finally

    经典面试题:  程序执行结果是100: (一):final和finally和finalize的区别