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的简单应用. /*************************** ...
随机推荐
- 伪静态对struts action的重写
参见 http://ocaicai.iteye.com/blog/1312189 最重要的而是在web.xml中配置 <filter-mapping> <filter-name> ...
- MSComm串口类的使用 (程序设计)
参考文档:http://wenku.baidu.com/link?url=MLGQojaxyHnEgngEAXG8oPnISuM9SVaDzNTvg0oTSrrJkMXIR_6MR3cO_Vnh-gr ...
- Hbase Basic
启动:start-hbase.sh 停止:stop-hbase.sh 进入shell:hbase shell 状态:status 创建表:create 'tableName', 'colFam1' 查 ...
- 王立平--eclipse中改动android项目的版本
改动版本 1.右键-->properties 2.android.改动须要的版本 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQyNTU ...
- Hibernate学习六----------CRUD
© 版权声明:本文为博主原创文章,转载请注明出处 实例 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0 ...
- 在 Ubuntu16.04上安装并使用Docker
介绍 Docker是一个开放源代码软件项目,让应用程序布署在软件容器下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制[1].Docker ...
- 命令行高效操作Git,看这篇就够了
原文地址:http://blog.jboost.cn/2019/06/16/use-git.html 对于软件开发人员来说,git几乎是每天都需要接触的工具.但对于相处如此亲密的工作伙伴,你对它的了解 ...
- servletResponse 文件下载
package response; import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOEx ...
- Spark Streaming和Kafka整合开发指南(二)
在本博客的<Spark Streaming和Kafka整合开发指南(一)>文章中介绍了如何使用基于Receiver的方法使用Spark Streaming从Kafka中接收数据.本文将介绍 ...
- Android应用开发:网络工具——Volley(二)
引言 在Android应用开发:网络工具--Volley(一)中结合Cloudant服务介绍了Volley的一般使用方法.当中包括了两种请求类型StringRequest和JsonObjectRequ ...