POJ 2409 Let it Bead:置换群 Polya定理
题目链接:http://poj.org/problem?id=2409
题意:
有一串n个珠子穿起来的项链,你有k种颜色来给每一个珠子染色。
问你染色后有多少种不同的项链。
注:“不同”的概念是指无论怎样旋转或翻转项链,都与之前的不同。
题解:
本题用到了置换的相关知识:
(1)Burnside引理:
等价类数目 = 所有C(f)的平均值 (C(f)为置换f的不动点数目)
(2)置换f可以分解成m(f)个循环的乘积,假设涂k种颜色:
C(f) = k^m(f)
(3)Polya定理:(综上)
等价类数目 = 所有k^m(f)的平均数
考虑两种操作,旋转和翻转:
(1)旋转:
先假定所有的旋转都是顺时针(逆时针也一样)。
那么对于旋转这个操作,总共有n个置换:
不旋转(旋转0格)、顺时针旋转1格(1个珠子的距离)、2格、3格...n-1格。
所以现在要算的就是每个置换f的m(f),然后使用Polya定理。
旋转i格:m(f) = gcd(n,i)
所以sum += ∑( k^gcd(n,i) ) (0<=i<=n-1)
(2)翻转:
有两种情况,n为奇数或偶数。
1.偶数:
共有n个对称轴,也就是有n个置换。
I. 其中,n/2个对称轴不穿过珠子。这种置换的m(f) = n/2 。
所以sum += (n/2) * (k^(n/2))
II.另外n/2的对称轴恰好经过2颗珠子。这种置换的m(f) = n/2 - 1 。
所以sum += (n/2) * (k^(n/2-1))
综上:sum += (n/2) * ( k^(n/2) + k^(n/2-1) )
2.奇数:
共有n个对称轴,也就是有n个置换。并且每个对称轴恰好经过一颗珠子。
所有置换的m(f) = (n-1)/2
所以sum += n * ( k^((n-1)/2) )
呼。。。两种操作讨论完了。
因为两种操作总共有2*n个置换。
所以呢。。。
答案是:sum/(2*n) ヾ(๑╹◡╹)ノ"
AC Code:
// num of equivalence class = average C(f)
// C(f) = k ^ m(f) -> num of fixed points
// m(f) = circle num in each permutation #include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 40 using namespace std; int n,t;
int POW[MAX_N]; int gcd(int a,int b)
{
return b==?a:gcd(b,a%b);
} int main()
{
while(cin>>t>>n)
{
if(n== && t==) break;
POW[]=;
for(int i=;i<=n;i++)
{
POW[i]=POW[i-]*t;
}
int sum=;
// rotate
for(int i=;i<n;i++)
{
sum+=POW[gcd(n,i)];
}
// overturn
if(n&) sum+=n*POW[(n+)/];
else sum+=(n/)*(POW[n/+]+POW[n/]);
cout<<sum/(*n)<<endl;
}
}
POJ 2409 Let it Bead:置换群 Polya定理的更多相关文章
- poj 1286 Necklace of Beads & poj 2409 Let it Bead(初涉polya定理)
http://poj.org/problem?id=1286 题意:有红.绿.蓝三种颜色的n个珠子.要把它们构成一个项链,问有多少种不同的方法.旋转和翻转后同样的属于同一种方法. polya计数. 搜 ...
- POJ 2409 Let it Bead(Polya定理)
点我看题目 题意 :给你c种颜色的n个珠子,问你可以组成多少种形式. 思路 :polya定理的应用,与1286差不多一样,代码一改就可以交....POJ 1286题解 #include <std ...
- poj 2409 Let it Bead【polya定理+burnside引理】
两种置换 旋转:有n种,分别是旋转1个2个--n个,旋转i的循环节数位gcd(i,n) 翻转:分奇偶,对于奇数个,只有一个珠子对一条边的中点,循环节数为n/2+1:对于偶数个,有珠子对珠子和边对边,循 ...
- POJ 2409 Let it Bead【Polya定理】(模板题)
<题目链接> 题目大意:用k种颜色对n个珠子构成的环上色,旋转.翻转后相同的只算一种,求不等价的着色方案数. 解题分析: 对于这种等价计数问题,可以用polay定理来解决,本题是一道pol ...
- POJ 2409 Let it Bead [置换群 Polya]
传送门 题意:$m$种颜色$n$颗珠子,定义旋转和翻转两种置换,求不等价着色数 暴力求每个置换的循环节也许会$T?$ 我们可以发现一些规律: 翻转: $n$为奇数时每个置换有$1+\frac{n-1} ...
- POJ 2409 Let it Bead(polya裸题)
题目传送:http://poj.org/problem?id=2409 Description "Let it Bead" company is located upstairs ...
- bzoj 1004 Cards & poj 2409 Let it Bead —— 置换群
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1004 关于置换群:https://www.cnblogs.com/nietzsche-oie ...
- bzoj 1004 [HNOI2008]Cards && poj 2409 Let it Bead ——置换群
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1004 http://poj.org/problem?id=2409 学习材料:https:/ ...
- poj2409:Let it Bead(置换群 polya定理)
题目大意:长度为n的项链,要染m种颜色,可以通过旋转或翻转到达的状态视为同一种,问有多少种染色方案. 学了一波polya定理,发现很好理解啊,其实就是burnside定理的扩展. burnside定理 ...
- POJ 2409 Let it Bead(Polya简单应用)
Let it Bead 大意:给你m种颜色,n个珠子串起来.旋转跟反转同样算同样,问有多少种不同的涂色组合方式. 思路:Polya的简单应用. /*************************** ...
随机推荐
- 数据结构之---C语言实现图的数组(邻接矩阵)存储表示
//图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #define MAX_VEX_NUM 50 typedef c ...
- 微信小程序 - 考试状态不同显示
未开考 .已交卷. 考试中 .考试结束 #ddd #f00 #ff0 默认禁用色 禁用的button仅有style起作用,四个状态,通过wx:if ... elif ... e ...
- PHP之面向对象学习
1.类 Class lio{ Public Protect Private Function __constructor(){} } 2.类的实例化 <? php class lio{ //定义 ...
- Archlinux 下的 VMWare Workstation 维护笔记
印象中 Archlinux 下的 VMWare Workstation 总是出问题, 因此写这个帖子, 记录出问题时间/原因/解决方案. PS: 每次更新内核后可能需要重新编译 vmware 的内核模 ...
- 记录MySQL运行的SQL
对照Oracle功能去学习Mysql总会发现亮点 Oracle中通过日志挖掘这一技能,能够找到以前运行过的全部记录: Mysql中也提供了3种方法{验证过的,我会记录详细做法} 方法1:{已验证} 记 ...
- select设置innerHMTL
select控件在标准浏览器下可以直接innerHTML设置内容,IE则不行. HTML结构: <form name="form1"> <select name= ...
- 关于iOS Tabbar的一些设置
事实上iOS Tabbar的可定制性很高,我们没有必要反复造轮子,以下是笔者收集的一些tabbar的经常使用设置.希望对大家有所帮助. 设置tabbar选中颜色 iOS7设置例如以下: [self.t ...
- 分布式服务框架 Zookeeper(一)介绍
一.概述 ZooKeeper(动物园管理员),顾名思义,是用来管理Hadoop(大象).Hive(蜜蜂).Pig(小猪)的管理员,同时Apache Hbase.Apache Solr.LinkedIn ...
- 在dev目录创建一个字符设备驱动的流程
1.struct file_operations 字符设备文件接口 1: static int mpu_open(struct inode *inode, struct file *file) 2: ...
- Boost.Asio c++ 网络编程翻译(11)
*_at方法 这些方法在一个流上面做随机存取操作.你来指定read和write操作从什么地方開始(offset): async_read_at(stream, offset, buffer [, co ...