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

由于颜色可以全选,那么根据 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. 「算法笔记」快速傅里叶变换(FFT)

    一.引入 首先,定义多项式的形式为 \(f(x)=\sum_{i=0}^n a_ix^i\),其中 \(a_i\) 为系数,\(n\) 为次数,这种表示方法称为"系数表示法",一个 ...

  2. Handing Incomplete Heterogeneous Data using VAEs

    目录 概 主要内容 ELBO 网络结构 不同的数据 HI-VAE 代码 Nazabal A., Olmos P., Ghahramani Z. and Valera I. Handing incomp ...

  3. IT6516功能兼容芯片|DP转VGA方案|CS5202替代兼容IT6516

    台湾联阳T6516是一种高性能的DP显示端口到VGA转换器方案芯片.IT6516结合DisplayPort接收器和三重DAC,通过转换功能支持DisplayPort输入和VGA输出.内置Display ...

  4. Linux压缩和解压类

    gzip/gunzip gzip 文件:压缩文件为.gz gunzip 文件:解压文件 注: 1. 只能压缩和解压文件 2. 只是将hello.txt压缩成hello.txt.gz,并没有改变存储位置 ...

  5. JS中常见的几种控制台台报错

    Error 控制台报错 EvalError 全局错误RangeError 引用错ReferenceError 参数错误SyntaxError 语法错误TypeError 类型错误URIError 编码 ...

  6. Linux架构中代理服务器配置与负载均衡

    本期内容概要 代理 负载均衡 内容详细 1.代理 1.主要作用: 将流量平均分配 2.代理的方式 01 正向代理 外部想要访问服务器 先找代理 找到之后还需要找服务器 应用:VPN 02 反向代理 外 ...

  7. django 修改模型中默认字段类型

    在ADMIN页面实现一个密码框,模型中是CharField默认类型是textinput,实现方法是在admin.py中重写widgets. 来自为知笔记(Wiz)

  8. Centos7 暂时记录

    chown 修改属主和属组信息 chown -R 对目录所有子的子目录和文件进行修改属主信息 w命令 USER TTY FROM    LOGIN@ IDLE JCPU PCPU WHATroot   ...

  9. LINUX学习-Mysql集群-多主一从备份

    基本原理:从服务器开启两个线程,一个备份主1,一个备份主2. 一.准备 主1:192.168.88.20 主2:192.168.88.30 从:192.168.88.40 两个主服务器开启binlog ...

  10. stm32单片机利用ntc热敏电阻温度转换公式C语言版

    首先 我们需要明确电路结构 热敏电阻的原理就不再赘述,本文不凑字数,只讲干货 必须要知道的就是串联电阻R9程序中定义为resistanceInSeries ,精度越高越好 为了方便,先在程序中定义好你 ...