算法合集之《pálya计数法的应用》
- 格式:doc
- 大小:162.59 KB
- 文档页数:14
a星算法求解八数码问题python一、介绍八数码问题是一种经典的智力游戏,也是人工智能领域中的经典问题之一。
在这个问题中,有一个3×3的棋盘,上面摆着1至8这8个数字和一个空格,初始状态和目标状态都已知。
要求通过移动数字,将初始状态变换成目标状态。
其中空格可以和相邻的数字交换位置。
为了解决这个问题,我们可以使用A*算法。
本文将详细介绍如何用Python实现A*算法来求解八数码问题。
二、A*算法简介A*算法是一种启发式搜索算法,常用于寻找最短路径或最优解等问题。
它基于Dijkstra算法,并加入了启发式函数来加速搜索过程。
在A*算法中,每个节点都有两个估价值:g值和h值。
g值表示从起点到该节点的实际代价,h值表示从该节点到目标节点的估计代价。
启发式函数f(n) = g(n) + h(n) 表示从起点到目标节点的估计总代价。
A*算法采用优先队列来保存待扩展的节点,并按照f(n)值从小到大排序。
每次取出队头元素进行扩展,并将扩展出来的新节点按照f(n)值插入队列中。
当扩展出目标节点时,算法结束。
三、八数码问题的状态表示在八数码问题中,每个状态都可以表示为一个3×3的矩阵。
我们可以用一个一维数组来表示这个矩阵,其中0表示空格。
例如,初始状态可以表示为[2, 8, 3, 1, 6, 4, 7, 0, 5],目标状态可以表示为[1, 2, 3, 8, 0, 4, 7, 6, 5]。
四、A*算法求解八数码问题的步骤1.将初始状态加入优先队列中,并设置g值和h值为0。
2.从队头取出一个节点进行扩展。
如果该节点是目标节点,则搜索结束;否则,将扩展出来的新节点加入优先队列中。
3.对于每个新节点,计算g值和h值,并更新f(n)值。
如果该节点已经在优先队列中,则更新其估价值;否则,将其加入优先队列中。
4.重复第2步至第3步直到搜索结束。
五、Python实现以下是用Python实现A*算法求解八数码问题的代码:```import heapqimport copy# 目标状态goal_state = [1,2,3,8,0,4,7,6,5]# 启发式函数:曼哈顿距离def h(state):distance = 0for i in range(9):if state[i] == 0:continuerow = i // 3col = i % 3goal_row = (state[i]-1) // 3goal_col = (state[i]-1) % 3distance += abs(row - goal_row) + abs(col - goal_col)return distance# A*算法def A_star(start_state):# 初始化优先队列和已访问集合queue = []visited = set()# 将初始状态加入优先队列中,并设置g值和h值为0heapq.heappush(queue, (h(start_state), start_state, 0))while queue:# 取出队头元素进行扩展f, state, g = heapq.heappop(queue)# 如果该节点是目标节点,则搜索结束;否则,将扩展出来的新节点加入优先队列中。
playfair密码算法
Playfair密码算法是一种基于双字母替换的加密方法,它是在19世纪末由英国政治家和密码学家Charles Wheatstone发明的。
该算法使用一个5x5的矩阵来存储密钥,其中包含26个字母(J和I 被视为相同的字母)。
该算法的加密过程如下:
1. 将明文分成双字母组(如果有奇数个字母,则在末尾添加一个字母“X”)。
2. 如果某个双字母组中的两个字母相同,则在它们之间插入一个字母“X”。
3. 对于每个双字母组,按照以下规则进行加密:
a) 如果两个字母在矩阵中的同一行,则将它们替换为该行中的下一个字母(如果它们是该行的最后一个字母,则循环到该行的第一个字母)。
b) 如果两个字母在矩阵中的同一列,则将它们替换为该列中的下一个字母(如果它们是该列的最后一个字母,则循环到该列的第一个字母)。
c) 如果两个字母不在同一行也不在同一列,则将它们替换为它们所在行和另一个字母所在列的交点字母。
4. 将所有双字母组拼接在一起,得到密文。
解密过程与加密过程类似,只需要将加密时的替换规则反过来即可。
Playfair密码算法相对于其他古典密码算法有较高的安全性,
但它仍然存在被暴力破解的风险。
在现代密码学中,Playfair密码算法已经被更复杂、更安全的算法所取代。
Pólya原理及其应用华东师大二附中符文杰Pólya原理是组合数学中, 用来计算全部互异的组合状态的个数的一个十分高效、简便的工具。
下面, 我就向大家介绍一下什么是P ólya原理以及它的应用。
请先看下面这道例题:【例题1】对2*2的方阵用黑白两种颜色涂色, 问能得到多少种不同的图像?经过旋转使之吻合的两种方案, 算是同一种方案【问题分析】由于该问题规模很小, 我们可以先把所有的涂色方案列举出来。
一个2*2的方阵的旋转方法一共有4种:旋转0度、旋转90度、旋转180度和旋转270度。
(注:本文中默认旋转即为顺时针旋转) 我们经过尝试, 发现其中互异的一共只有6种:C3、C4、C5、C6是可以通过旋转相互变化而得, 算作同一种;C7、C8、C9、C10是同一种;C11、C12是同一种;C13、C14、C15、C16也是同一种; C1和C2是各自独立的两种。
于是, 我们得到了下列6种不同的方案。
但是, 一旦这个问题由2*2的方阵变成20*20甚至200*200的方阵, 我们就不能再一一枚举了, 利用Pólya 原理成了一个很好的解题方法。
在接触Pólya原理之前, 首先简单介绍Pólya原理中要用到的一些概念。
群:给定一个集合G={a,b,c,…}和集合G上的二元运算, 并满足:(a) 封闭性: (a,b(G, (c(G, a*b=c。
(b) 结合律: (a,b,c(G, (a*b)*c=a*(b*c)。
(c) 单位元: (e(G, (a(G, a*e=e*a=a。
(d) 逆元:(a(G, (b(G, a*b=b*a=e, 记b=a-1。
则称集合G在运算*之下是一个群, 简称G是群。
一般a*b简写为ab。
置换:n 个元素1,2,…,n 之间的一个置换 表示1被1到n 中的某个数a1取代, 2被1到n 中的某个数a2取代, 直到n 被1到n 中的某个数an 取代,且a1,a2,…,an 互不相同。
LOTA原理及实战运用前言LOTA的研究始于2001年,2003年7月在MSO网站推出了早期的原形模块,经过一年多的公开试用,于2004年底发布了功能体系比较完整的测试版。
相比同一时期市场上涌现的其他球赛分析工具,LOTA是唯一一套以实力模型为理论基础、赔率为主要研究对象的软件系统,在国内赔率研究领域颇具代表性和开创性。
一年多来,MSO论坛上围绕LOTA原理和应用的探讨一直未曾间断,系统得以不断改进和完善,作为LOTA开发者衷心感谢所有曾经给予批评、建议和关注的使用者。
在充分总结理论和实践中出现的各种问题的基础上,本文首次从系统原理的深层全方位解析LOTA,以期使用者和研究者更好地了解和运用该系统,并在新的应用层面上继续促进LOTA走向更高级的完善。
一、LOTA关于博彩的基本理念1. 游戏的两重性博彩从本质来说是概率的游戏,博彩结果服从特定概率而呈现随机性。
游戏的构成元素中,最核心的是“博项”,也就是“用来博彩的项目”,比如足球比赛、赛马、骰子等等。
决定输赢的博项必须具备结果的多重性和随机性两个特点——没有结果的多重性就不能有效分散投注,而缺少随机性的结果最终也会因为容易预测而导致注码集中,两种局面都会摧毁博彩的基础,令博彩业不复存在。
博项的两个必要条件客观地让博彩从本质上成为随机性极强的游戏——这一结论永远不会改变。
随机性成为所有博彩玩家首先必须面对的现实,也为庄家的生存打下坚实基础,后者通过设置不公平的赔率或规则,在与玩家进行随机事件主宰的博彩游戏时稳占上风。
如此说来玩家受制于这种我们称之为“随机困境”的局面,似乎无法赢得这个游戏,除非短暂的、纯粹幸运的情况降临。
然而,事物总有两面。
“商业化”无孔不入地渗透体育和博彩领域,两个行业发生奇妙的化学作用,正令体育类博彩逐渐偏离传统的轨道:博项的表面随机性被加以利用,而随机性本身的可信度却在动摇;与此同时,庄家在可以承受的风险范围内不时逾越保守的“均布利润”的传统行规,以求利润的最大化。
正立方体六个面的着色问题图解Pólya计数法Mr. Thursday不知道各位阅读一篇blog的时候都是什么样子的时间?刚吃饱饭?刚做完剧烈运动?还是深夜还没睡觉的时候?也许各位只有10分钟左右的注意力可以阅读这篇文章,但是数学相关的内容常常需要很多血液在大脑才能了解,在各位读者大脑缺血的状态下,硬是要大家脑充血,实在是有点残酷。
不过这篇文章有另外一个尝试,就是使用图解的方式,让大家可以用比较轻松的方式了解还满有难度的Pólya计数法。
各位读者不必学过很难的定理,只要会「加法」、「乘法」、以及对三度空间有一些些想象力,就可以了解!愿意试试看吗?让我们往下继续阅读吧!开始之前先把Pólya本尊以及他发明的公式列在下面,今天的目标就是让各位经松了解这个公式,甚至一辈子都不会忘记喔!加法原理和乘法原理不知道各位是否还记得中学时候学到的排列组合。
在这部分我们稍微有些直觉上的复习。
首先让我们注意到如果今天有一个瓷砖,然后我们有两种颜色,但是瓷砖一次只能上一种颜色,那么有几种着色法呢? 我想大家应该都会回答是两种。
譬如说下面这张图:问号代表一个还没上色的瓷砖。
右手边代表这两种可能的着色方法:红色、「或是」蓝色。
接下来让我们推广到两个瓷砖的时候。
如果有两种颜色(红色、蓝色),分别涂在两个瓷砖上面,总共有几种着色呢?让我们可视化这个问题的答案:所以我们可以看到,有四种着色方法。
在继续讨论之前,我们想做一件事,就是跨越「符号化」的鸿沟。
首先,上面四种着色方法,我们如果用中文来念,分别就是:「红红」、「红蓝」、「蓝红」、「蓝蓝」。
如果我们用英文来代表呢?红色是Red,所以用字母R来代表,蓝色是Blue,所以用B来代表,那么刚才四种着色方法,用英文字母来表示,就变成RR、RB、BR、BB了!跨越符号化的鸿沟之后,我们要开始进入这一段的重点:加法原理和乘法原理。
我想各位应该都知道加法,譬如说1+1 = 2。
《算法的应用》学历案(第一课时)一、学习主题本课学习主题为“算法的应用”,旨在让学生初步了解算法的基本概念,掌握简单的算法设计思路,并通过实际案例的操作体验,培养学生利用算法解决问题的能力。
通过本课程的学习,学生将学会使用信息技术中的算法来提高处理数据的效率和准确性。
二、学习目标1. 理解算法的基本概念,知道算法在信息技术中的应用。
2. 掌握简单的算法设计思路,能够分析并描述算法的步骤。
3. 通过实际操作,学会使用编程软件实现简单的算法。
4. 培养学生的逻辑思维能力和问题解决能力,提高学生的信息素养。
三、评价任务1. 评价学生对算法基本概念的掌握情况,通过课堂提问和小组讨论的方式进行。
2. 评价学生对算法设计思路的理解程度,通过案例分析和小组合作的方式进行评价。
3. 评价学生的实际操作能力,通过编程练习和项目作业的方式进行。
4. 评价学生的综合表现,包括课堂表现、小组活动中的合作能力和项目完成的效率等。
四、学习过程1. 导入新课:通过展示生活中常见的算法应用案例(如排序问题、查找问题等),引导学生思考算法在信息技术中的作用,激发学生的学习兴趣。
2. 新课讲解:讲解算法的基本概念、特点及在信息技术中的应用,通过实例演示让学生直观了解算法的运行过程。
3. 案例分析:分析一个具体的算法设计案例,让学生了解算法的设计思路和实现步骤。
4. 编程实践:学生动手操作,使用编程软件实现一个简单的算法,教师巡视指导,及时解答学生疑问。
5. 课堂小结:总结本课学习的重点内容,强调算法在信息技术中的重要性,鼓励学生将所学知识应用到实际生活中。
五、检测与作业1. 课堂检测:通过课堂小测验,检测学生对算法基本概念的掌握情况。
2. 编程练习:布置编程练习作业,让学生进一步巩固所学知识,提高实际操作能力。
3. 项目作业:小组合作,完成一个简单的算法设计项目,培养学生的合作能力和问题解决能力。
六、学后反思1. 教师反思:教师需要反思本课的教学效果,总结教学过程中的优点和不足,为今后的教学提供借鉴。
分类加法计数原理的应用什么是分类加法计数原理?分类加法计数原理是一个基本的数学概念,用于解决许多实际问题中的计数问题。
它通过将问题划分为不同的情况并逐个计数,然后将结果相加,从而得到最终的计数值。
分类加法计数原理可以应用于各种问题,包括排列组合、概率计算等。
分类加法计数原理的应用场景场景1:组织活动的安排假设你负责组织一个学校的欢迎会活动,活动包括三个部分:开场表演、游戏环节和抽奖环节。
为了使活动更加有趣,你需要设计不同的开场表演、游戏和奖品。
在这种情况下,你可以利用分类加法计数原理来计算不同活动组合的可能性。
首先,你可以列出所有可能的开场表演的选项,比如舞蹈、歌曲表演和戏剧表演等。
然后,你可以列出所有可能的游戏选项,比如猜谜游戏、足球比赛和拔河比赛等。
最后,你可以列出所有可能的奖品选项,比如笔记本电脑、手机和礼品卡等。
假设有3种开场表演选项,4种游戏选项和2种奖品选项,按照分类加法计数原理,总共可能的组合方式为3 * 4 * 2 = 24种。
这样,你就可以根据这个计数值来制定活动的安排,确保每个环节都有各种组合的可能性。
场景2:购物车中商品排列组合假设你在网上购物,你需要购买衣服、鞋子和配饰。
每个类别都有多个选项可供选择。
例如,你可以选择不同颜色、尺码和款式的衣服,不同款式和品牌的鞋子,以及不同种类的配饰。
为了确定购物车中可能的组合方式,你可以使用分类加法计数原理。
首先,你可以列出所有可选的衣服组合,如红色T恤、蓝色连衣裙等。
然后,你可以列出所有可选的鞋子组合,如运动鞋、高跟鞋等。
最后,你可以列出所有可选的配饰组合,如项链、手链等。
假设有4种衣服选项,3种鞋子选项和2种配饰选项,按照分类加法计数原理,总共可能的组合方式为4 * 3 * 2 = 24种。
这样,你可以根据这个计数值来确定购物车中不同商品的排列组合方式,从而更好地满足你的购物需求。
总结分类加法计数原理是一个重要的数学概念,可以应用于各种问题中的计数。
Pólya计数法的应用南京外国语学校陈瑜希目录Pólya计数法的应用 (1)目录 (1)摘要 (2)关键字 (2)问题的提出 (2)[例一]He's Circles SGU294 (2)预备知识 (3)Burnside引理 (4)Pólya计数法 (6)应用 (8)[例二]Cubes UVA 10601 (8)[例三]Transportation is fun SPOJ 419 SPOJ422 (9)[例四]Isomorphism SGU282 (11)总结 (13)参考文献 (14)摘要在信息学竞赛中,我们会遇到许许多多的计数问题,很多问题看似困难,但熟练掌握Pólya计数法后,可以轻松解决。
本文从一道信息学竞赛中出现的例题谈起,首先介绍了发现这题用普通计数法解决所遇到的困难,然后介绍了群、置换、置换群的基本概念、性质,并在此基础上引入Burnside定理,最后得出Pólya计数法,并给出证明。
最后通过几道例题说明了Pólya计数法在信息学竞赛中的应用,并进行总结。
关键字Burnside定理Pólya计数法问题的提出[例一] He's Circles SGU294有一个长度为N的环,上面写着’X’和’E’,问本质不同的环有多少种。
(N不超过200000)。
[分析]这个问题由于是一个环,许多未经过旋转时不同的方案,经过旋转之后就成了相同的方案,如果单纯的利用乘法原理来计算,无法排除这些相同的方案。
如果想要用枚举法来做,需要枚举所有方案。
枚举量不会低于本质不同的环的个数。
事实证明,本质不同的环的个数是2n级别的。
对于N=200000的数据规模,答案会有6万多位,显然枚举是行不通的。
组合数学中,有一种计数法,可以很好的解决这类问题。
预备知识下面,我们介绍一种重要的计数工具——P ólya 计数法。
为了理解P ólya 计数法,我们首先来看一下它所需要用到的概念。
群给定一个集合G={a,b,c,…}和集合G 上的二元运算,并满足:(a) 封闭性:∀a,b ∈G , ∃c ∈G , a*b=c 。
(b) 结合律:∀a,b,c ∈G , (a*b)*c=a*(b*c)。
(c) 单位元:∃e ∈G , ∀a ∈G , a*e=e*a=a 。
(d) 逆元:∀a ∈G , ∃b ∈G, a*b=b*a=e ,记b=a -1。
则称集合G 在运算*之下是一个群,简称G 是群。
一般a*b 简写为ab 。
置换n 个元素1,2,…,n 之间的一个置换⎪⎪⎭⎫ ⎝⎛n a a a n 2121表示1被1到n 中的某个数a 1取代,2被1到n 中的某个数a 2取代,直到n 被1到n 中的某个数a n 取代,且a 1,a 2,…,a n 互不相同。
置换群置换群的元素是置换,运算是置换的连接。
例如:⎪⎪⎭⎫ ⎝⎛=⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛=⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛1342432113424213421343211234432142134321 可以验证置换群满足群的四个条件。
例1中置换群G={转0格、转1格、转2格、转3格……转(n-1)格} ⎪⎪⎭⎫ ⎝⎛n n 2121⎪⎪⎭⎫ ⎝⎛13221 n ⎪⎪⎭⎫ ⎝⎛24321 n ⎪⎪⎭⎫ ⎝⎛35421 n ……⎪⎪⎭⎫ ⎝⎛--2121n n n n Burnside 引理介绍下面我们介绍P ólya 计数法所要用到的一个引理——Burnside 定理。
用D(a j ) 表示在置换aj 下不变的元素的个数。
L 表示本质不同的方案数。
在例一中,对于N=4的情况。
一共有4个置换:⎪⎪⎭⎫ ⎝⎛43214321⎪⎪⎭⎫ ⎝⎛14324321⎪⎪⎭⎫ ⎝⎛21434321⎪⎪⎭⎫ ⎝⎛32144321 所有方案在置换a 1下都不变,D(a 1)=16XXXX 和EEEE 在置换a 2下不变,D(a 2)=2XXXX 和EEEE 以及XEXE 与EXEX 在置换a 3下不变,D(a 3)=4XXXX 和EEEE 在置换a 4下不变,D(a 4)=2 计算出6)24216(41=+++=L 证明证明Burnside 定理需要这样一个推论:设c 为 中的一种着色,那么与c 等价的着色数等于G 中的置换个数除以 c 的稳定核中的置换个数。
定理1:对于每一种着色 c ,c 的稳定核 G (c)是一个置换群,而且对 G 中任意置换 f 与 g , g*c=f*c 当且仅当 f -1 g 属于 G(c)。
证明:如果 f 和 g 都使c 保持不变,则先 f 后 g 将使。
保持不变,即(g f) ( c ) =c 。
于是,在合成运算下,G(c)具有封闭性。
显然,单位元使得所有着色不变。
如果 f 使 c 不变,那么 f -1也使c 不变,于是 G(c)具有对逆的封闭性。
由于满足置换群定义的所有性质,所以,G(c)是一个置换群。
∑==sj j a D G L 1)(||1假设f*c=g*c 则所以f-1 g使c不变,因此,f-1。
g 属于G(c),反之,假设f-1 g属于G(c) ,通过类似的计算可证得f*c=g*c作为定理1的一个推论,我们可以从已知的一种着色 c 出发,确定出在G 的作用下不同的着色数。
推论2:设c为中的一种着色,那么与 c 等价的着色数等于G 中的置换个数除以 c 的稳定核中的置换个数,即证明:设 f 是G 中的一个置换,根据定理1,满足g*c=f*c的置换g 实际上就是中的那些置换。
由消去律,则从f h=f h’得到h=h’。
于是,集合中的置换个数等于G(c)中置换的个数。
从而,对每个置换 f ,恰好存在|G(C)|个置换,这些置换作用在c上跟 f 有同样的效果。
因为总共有|G|个置换,所以,与c等价的着色数等于有了这个推论,证明Burnside定理就是我们前面已多次用到的一些技巧的简单应用,即先采取两种不同的方式进行计数,然后使计数相等。
究竟计什么数呢?我们要数使f 保持c 不变即f*c=c的对偶(f,c)的个数。
一种计数的方式是考察G 中的每个f ,并计算f 保持着色不变的着色数,然后相加所有的量。
因D(f)是通过f 保持着色不变的着色集,所以用这种方式计数得到另一种计数的方式是考察中的每个c ,计算满足f *c=c 的置换f 的个数,然后相加所有的量。
对每种着色,满足f *c =c 的所有f 的集合就是我们所称的c 的稳定核G (c)。
因此,每个c 对和的贡献是于是,用这种方式计数,得到但如果我们按等价类将着色归类,那么和式可以简化。
在同一等价类中,两种着色对和贡献了同样的量,每个等价类的总贡献是|G|。
由于等价类的个数就是不等价的着色数L ,所以,等于L|G|解出L 即得Pólya 计数法介绍我们发现要计算D(a j )的值不是很容易,如果采用搜索的方法,总的时间规∑==sj j a D G L 1)(||1∑==sj j a D G L 1)(||1模为O(nsp)。
(n 表示元素个数,s 表示置换个数,p 表示格子数,这里n 的规模是很大的) 下一步就是要找到一种简便的D(a j )的计算方法。
先介绍一个循环的概念:循环:记称为n 阶循环。
每个置换都可以写若干互不相交的循环的乘积,两个循环(a 1a 2…a n )和(b 1b 2…b n )互不相交是指a i ≠b j , i,j=1,2,…,n 。
例如:这样的表示是唯一的。
置换的循环节数是上述表示中循环的个数。
例如(13)(25)(4)的循环节数为3。
设G 是p 个对象的一个置换群,用m 种颜色涂染p 个对象,则不同染色方案为:其中G={g 1 ,…g s } c(g i )为置换g i 的循环节数(i=1…s)在例一中,我们给N=4的环标号:1 24 3构造置换群G'={g 1,g 2,g 3,g 4},|G'|=4,令g i 的循环节数为c(g i ) (i=1,2,3,4) 在G'的作用下,其中g 1表示转0° , 即g 1=(1)(2)(3)(4) c(g 1)=4g 2表示转90°, 即g 2=(4 3 2 1) c(g 2)=1g 3表示转180°, 即g 3=(1 3)(2 4) c(g 3)=2g 4表示转270°, 即g 4=(1 2 3 4) c(g 4)=12c(g1)=24=16=D(a 1) 2c(g2)=21=2= D(a 2)2c(g3)=22=4=D(a 3) 2c(g4)=21=2= D(a 4))m m (m ||1 )c(g )c(g )c(g s 21+++= G L )4)(25)(13(2415354321=⎪⎪⎭⎫ ⎝⎛这就是所谓的Pólya定理。
我们发现利用Pólya定理的时间复杂度为O(s p) (这里s表示置换个数,p表示格子数),与前面得到的Burnside引理相比之下,又有了很大的改进,其优越性就十分明显了。
Pólya定理充分挖掘了研究对象的内在联系,总结了规律,省去了许多不必要的盲目搜索,把解决这类问题的时间规模降到了一个非常低的水平。
证明:要得到在置换下稳定不动的方案,即把置换的每个循环节都染上相同的颜色,所以D(g i)=m c(gi)应用Pólya定理在信息学竞赛中有着许多应用实例。
这些问题往往不能直接套用公式计算,而需要更细致的分析。
下面我们通过几道例题来看一下信息学竞赛中出现的利用Pólya定理的计数问题。
[例二]Cubes UVA 10601要求把正方体的12条棱染色,并且每种颜色的个数给定,求总方案数(旋转后相同的方案算一种)。
[分析]这个问题是求对正方体的染色,且要求旋转后不变,很容易联想到Pólya计数法。
一个正方体共有24种旋转。
根据这些不同的旋转方法,构造对应的关于边的置换群。
如果直接使用Pólya计数法的计算公式来做,不能保证它每种颜色使用的个数与题目要求的匹配。
因此,需要一些改进。
回顾一下Pólya计数法的公式的推导过程:根据Burnside定理,本质不同的方案数为在每个置换下稳定不动的方案的总合除以总置换数。
而要得到在置换下稳定不动的方案,即把置换的每个循环节都染上相同的颜色,所以D(g i)=m c(gi)本题也是如此,也是要把置换的每个循环节都染上相同的颜色。
因此只需要对于每个置换,求出每个循环节的点的个数,用状态压缩动态规划求出每个循环节都染上相同的颜色,并且每种颜色的总和符合题目要求的方案总数,即可。