对Polya定理的个人认识

    我们先来看一道经典题目:

    He's Circles(SGU 294)

        有一个长度为N的环,上面写着“X”和“E”,问本质不同的环有多少个(不能旋转重复就称之为本质不同)

输入样例:4

输出样例:6

那么要怎么办呢?暴力显然暴不出来……

我们可以考虑使用置换群。

我们有两种算法:

①Burnside引理:

答案直接为1/|G|*(D(a1)+D(a2)+D(a3)+……+D(as))

其中D(ak)为在进行置换群置换操作ak下不变的元素的个数。

在N=4下一共有四个置换群:

(1 2 3 4    (1 2 3 4    (1 2 3 4    (1 2 3 4

1 2 3 4)    2 3 4 1)    3 4 1 2)    4 1 2 3)

那么显然在置换a1下都不变,那么D(a1)=16 (4*4)

EEEE和XXXX在置换a2下都不变,所以D(a2)=2

XXXX和EEEE还有XEXE以及EXEX在置换a3下都不变,所以D(a3)=4

XXXX和EEEE在置换a4的情况下都不变,D(a4)=2

最后根据公式计算出1/|4|*(16+2+4+2)=6(种)

 

        ②Polya定理

             回顾上面的Burnside算法,是否感觉D不太好实现呢?

那么我们就可以用一种更容易理解、适应力强、时间复杂度低、编程复杂度低的方法就是群论的最厉害的Polya定理

其实Polya定理与Burnside引理本质上的区别并不是很大,只不过入手问题的角度不一样。

我们可以发现,一个循环节之间的“不变元素”可以互相交换从而不影响整体,所以我们可以设Ci为置换群i的循环节个数。

例如(1 2 3 4 5

3 5 1 4 2)

的循环节就为:1和3循环1->3->1……

2和5循环2->5->2……

4和它自身循环4->4->4……

那么循环节数就为3

再回来看现在这个题目,我们可以抽象地把Ci替换掉Di

那么Di=p^C(i) (p为总共的字母数)

相同循环节中的元素可以互相置换,所以Di=p^C(i)

polya公式为1/|G|(p^C(1)+p^C(2)+……+p^C(s))

以4为例,则1/|G|=1/4

C(1):循环节为(1)(2)(3)(4),所以C(1)=4

C(2):循环节为(4 3 2 1),所以C(2)=1

C(3):循环节为(1 3)(2 4),所以C(3)=2

C(4):循环节为(1 2 3 4),所以C(4)=1

那么答案就为1/4(2^4+2^1+2^2+2^1)=6

这里的C相对于上面的D来说要简单,记得XJR学长给我讲过环的判定,直接任选一个没有选过的点,从这个点开始映射,走过的点标上1,等到再走到标上1时,结束,统计数加1

void search(int M){
	int i=M;//一开始从这里开始
	while(!flag[b[i]]){//如果它的映射没被访问过,那么说明它还没有构成环
		i=b[i];//继续映射
		flag[i]=1;//标记已访问
	}
	return ;//返回
}
int C(){
	int tmp=0;
	for(int i=1;i<=N;i++) if(!flag[i]) flag[i]=1,search(i),tmp++;//环数加1
	return tmp;//返回循环节数
}

  那么我们再加上一个快速幂,就可以进一步优化。

【群论】polya定理的更多相关文章

  1. UVA10294 Arif in Dhaka (群论,Polya定理)

    UVA10294 Arif in Dhaka (群论,Polya定理) 题意 : 给你一个长为\(n\)的项链和手镯,每个珠子有\(m\)种颜色. 两个手镯定义为相同,即它们通过翻转和旋转得到一样的手 ...

  2. [bzoj1488][HNOI2009]图的同构——Polya定理

    题目大意 求两两互不同构的含n个点的简单图有多少种. 简单图是关联一对顶点的无向边不多于一条的不含自环的图. a图与b图被认为是同构的是指a图的顶点经过一定的重新标号以后,a图的顶点集和边集能完全与b ...

  3. 【BZOJ1488】[HNOI2009]图的同构(Burside引理,Polya定理)

    [BZOJ1488][HNOI2009]图的同构(Burside引理,Polya定理) 题面 BZOJ 洛谷 题解 求本质不同的方案数,很明显就是群论这套理论了. 置换一共有\(n!\)个,考虑如何对 ...

  4. 群论&Polya计数

    群论&Polya计数 其实在我听课的过程中,我发现针对于学习OI中的群并没有什么过多必要向内学习... 群 以后会补的. 就是\(QQ\)群. 置换 置换就是一个... \[ \begin{m ...

  5. 等价类计数:Burnside引理 & Polya定理

    提示: 本文并非严谨的数学分析,有很多地方是自己瞎口胡的,仅供参考.有错误请不吝指出 :p 1. 群 1.1 群的概念 群 \((S,\circ)\) 是一个元素集合 \(S\) 和一种二元运算 $ ...

  6. 【转】Polya定理

    转自:http://endlesscount.blog.163.com/blog/static/82119787201221324524202/ Polya定理 首先记Sn为有前n个正整数组成的集合, ...

  7. [wikioi2926][AHOI2002]黑白瓷砖(Polya定理)

    小可可在课余的时候受美术老师的委派从事一项漆绘瓷砖的任务.首先把n(n+1)/2块正六边形瓷砖拼成三角形的形状,右图给出了n=3时拼成的“瓷砖三角形”.然后把每一块瓷砖漆成纯白色或者纯黑色,而且每块瓷 ...

  8. HDU 3923 Invoker(polya定理+逆元)

    Invoker Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 122768/62768 K (Java/Others)Total Su ...

  9. Polya定理

    http://www.cnblogs.com/wenruo/p/5304698.html 先看 Polya定理,Burnside引理回忆一下基础知识.总结的很棒. 一个置换就是集合到自身的一个双射,置 ...

随机推荐

  1. 前端自动化工具 -- fis 使用简介

    https://github.com/fex-team/fis FIS入门: http://fis.baidu.com/docs/beginning/getting-started.html FIS ...

  2. 利用MetaWeblog API实现XMLRPC写博客功能

    Windows Live Writer是一款小巧的写博客的工具,非常方便,甚至网上看到过有的评论称Live Writer是一款最不像微软产品的微软产品. Writer支持MSN Spaces以及Wor ...

  3. [CareerCup] 16.1 Thread and Process 线程和进程

    16.1 What's the difference between a thread and a process? 进程Process是程序执行时的一个实例.一个进程是被分配系统资源的独立单元,每个 ...

  4. 快速安装zabbix agent并部署监控

    1.准备yum源: epel源:yum install -y zabbix22-agent 2.上传脚本: 上传脚本事先写好的监控脚本到/script/下面 3.修改配置文件:Server=10.10 ...

  5. BizTalk开发系列(三十五) TCP/IP 适配器

    BizTalk 的TCP/IP适配器最初是为英国的保健行业开发.该适配器属于BizTalk进程内适配器,将消息通过TCP/IP 套接字符串在BizTalk服务器与远程客户端间进行通讯. TCP/IP适 ...

  6. poj3292-Semi-prime H-numbers(筛法打表)

    一,题意:  一个H-number是所有的模四余一的数.(x=4*k+1)  如果一个H-number是H-primes 当且仅当它的因数只有1和它本身(除1外). 一个H-number是H-semi ...

  7. Minimum no. of iterations to pass information to all nodes in the tree

    Given a very large n-ary tree. Where the root node has some information which it wants to pass to al ...

  8. 【iCore3 双核心板】例程三十三:SD_IAP_ARM实验——更新升级STM32

    实验指导书及代码包下载: http://pan.baidu.com/s/1jHmvQfk iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  9. 转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解

    Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解   多线程c语言linuxsemaphore条件变量 (本文的读者定位是了解Pthread常用多线程API和Pthread互斥锁 ...

  10. NEC学习 ---- 模块 - tab[含标题]

    简要介绍, 默认居左, Tab不定宽,  “标题”和“更多”可删, 扩展类可以自由组合, 依赖于reset.css(之前的模块以及布局都依赖这个css) 那么这个效果是怎么实现的呢? CSS代码: . ...