「SHOI2006」有色图
首先发现这题虽然是边的置换,但是是由点的置换所造成的,并且发现点置换对应的所有边置换和置换操作构成置换群。
由于颜色可以全选,那么根据 Polya 定理,答案为:
\]
注意到不同点的置换对应边置换不同,那么只需要考虑每个点置换对应边置换的贡献之和。
对于一个点置换,发现一个点循环置换内部导出子图的边一定置换到另一条也在导出子图当中的边,因此考虑分边循环置换是否在导出点循环置换导出子图内部来分类。
- 一个点循环置换内部(大小为 \(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\) 的点循环置换,它的贡献为:
\]
注意到数据范围较小,且只需要搜索所有划分数,因此可以直接爆搜通过。
需要注意的是,令 \(c_i\) 为大小为 \(i\) 的数选了 \(c_i\) 个,那么一种划分对应点循环置换个数为:
\]
需要注意一些实现上的问题,比如一定要保证每一轮搜索结束都能恰好搜到一个划分,不然复杂度是划分数前缀和的,具体方法就是从大往小搜,搜到 \(1\) 的时候强制填满。
同时需要注意每次搜索不要经过不填入划分当中的数,每次枚举下一个填的数是什么。
同时每次只考虑填入多少个数来减小贡献的计算,这样至少能保证每个划分数计算的次数只有 \(len(p) \le \sqrt{n}\) 次(\(len(p)\) 为划分 \(p\) 当中本质不同的数的个数)
然后如果边填数边计算贡献,原本计算单个划分数的复杂度就可以均摊到何其前缀相同的每个划分数上,这样复杂度就是 \(\mathcal{O}(p(n))\) 其中 \(p(n)\) 为 \(n\) 的划分数。
下面这份代码大概能在 \(1s\) 内跑完 \(80\).
同时贴一份划分数本质不同个数次幂和的表:这里
「SHOI2006」有色图的更多相关文章
- 「译」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 =& ...
随机推荐
- Google Chrome调整控制台的位置
众所周知,控制台是开发必备的工具,学会流畅的使用控制台会给我们的开发带来不一样的体验,但是控制台的位置有时却是困扰我们的一件事,控制台默认是在浏览器内,有时十分妨碍我们,那么有没有什么办法修改控制台的 ...
- Python基础入门(9)- Python文件操作
1.文件的读写 1.1.文件的创建与写入 利用内置函数open获取文件对象 文件操作的模式之写入 文件对象的操作方法之写入保存 1 # coding:utf-8 2 3 import os 4 5 c ...
- ORW-测信道攻击
做SCTF时碰到一个没看过的题型,比赛结束之后才知道是orw的一个玩法,测信道攻击.主要特点就是只给使用open,read,但是不给write,即无法把flag输出到终端.这里可以通过把flag读到栈 ...
- Api接口测试总是似懂非懂,只因这个原理没搞清楚
前言 掌握了http协议,就掌握了接口测试 笔者在网络上看过不少接口测试教程,一上来就开始讲怎么操作工具,而不告诉读者为什么要这么操作.读者可能照猫画虎成功了,也可能操作失败了但不知为何出错. 因 ...
- MongoDB性能诊断工具
1. mongostat * dirty 超过20%时阻塞新请求 * used 超过95%时阻塞新请求 * qrw 排队的请求 * conn 连接数量 mongostat:用于了解MongoDB运行状 ...
- PPT制作手机滑动粗糙效果
原文链接:https://www.toutiao.com/i6495291974680052238/ 选择"插入"选项卡,"插图"功能组."形状&qu ...
- Flowable实战(三)流程部署管理
一.流程定义的版本 当部署流程定义时,数据库中的流程定义会是这个样子: id key name version myProcess:1:676 myProcess My important pro ...
- 微信小程序使用Websocket
/** 初始化websocket stomp文档 http://jmesnil.net/stomp-websocket/doc/*/initSocket: function () {var that ...
- Flowable实战(四)BPMN2.0 启动与结束事件
一.BPMN2.0 BPMN2.0规范是一个标准,开源框架和不同供应商都遵循这份标准,使得最终用户不会因为依赖专有解决方案,而被供应商"绑架".有了BPMN2.0标准,不同解决 ...
- 机器学习&恶意代码检测简介
Malware detection 目录 可执行文件简介 检测方法概述 资源及参考文献 可执行文件简介 ELF(Executable Linkable Format) linux下的可执行文件格式,按 ...