NYOJ 280 LK的项链 &&POJ 2409 Let it Bead(polya 定理)

NYOJ 280 LK的项链  :click here

POJ 2409 Let it Bead:click here

题意:一盒有红、蓝、绿三种颜色的珠子,每种颜色珠子的个数都大于24,现在LK想用这一盒珠子穿出一条项链,项链上的珠子个数为n(0<=n&lt;=24),请你帮她计算一下一共可以用这一盒珠子可以穿出多少条不同的项链。通过旋转、翻转达到同一种状态的被认为是相同的项链。

poj 上是c种颜色,s个珠子组成,数据比24小。

思路:今天刚接触到polya 定理:

Polya定理:设G是n个对象的一个置换群,用m种颜色涂染这n个对象,则不同染色的方案数L=1/|G|*[m^p(a1)+m^p(a2)+....+m^p(an)].其中p(ai)是某个置换的循环数.

1.旋转置换.

我们假设依次顺时针旋转1~n个,则循环个数=gcd(i,n);

2.翻转置换

当n为偶数时,分两种情况,一种是中心轴在两个对称对象上,则循环个数为n/2+1,另一种是对称轴两边分别有n/2个对象,则循环个数为n/2;

当n为奇数时,对称轴就只能在一个对象上,则循环个数为n/2+1;

刚开始接触,不敢说完全的弄懂,有些知识还稍微了解,一知半解,以后多多接触此类的题目,争取搞明白

代码:

两个都一样,poj把3改为c就可以

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}
long long polya(int n,int m)
{
    if(n==0)return 0;
    long long sum=0;
    for(int i=1; i<=n; i++) //旋转的时候
        sum+=pow(double(m),double(gcd(n,i)));
    //翻转的时候
    if(n&1)sum+=n*pow(double(m),double((n+1)/2));//为奇数
    else sum+=n/2*(pow(double(m),double((n+2)/2))+pow(double(m),double(n/2)));//偶数的两种情况
    return sum/(2*n);
}
int main()
{
    int n;
    while(~scanf("%d",&n)&&n!=-1)
    {
        printf("%d\n",polya(n,3));
    }
    return 0;
}

时间: 2024-12-28 20:45:52

NYOJ 280 LK的项链 &&POJ 2409 Let it Bead(polya 定理)的相关文章

[ACM] POJ 2409 Let it Bead (Polya计数)

Let it Bead Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4434   Accepted: 2916 Description "Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. As you can deduce from the company name, their business is b

poj 2409 Let it Bead Polya计数

旋转能够分为n种置换,相应的循环个数各自是gcd(n,i),个i=0时不动,有n个 翻转分为奇偶讨论,奇数时有n种置换,每种有n/2+1个 偶数时有n种置换,一半是n/2+1个,一半是n/2个 啃论文,PPT,各种书好久才看懂Polya定理,近期做数学题做的严重怀疑自己的智商. #include <iostream> #include <cstdio> #include <cstdlib> #include<algorithm> #include<ma

POJ 2409 Let it Bead P&#243;lya定理

题目大意:给定一个n个点的环,可以旋转和翻转,要求涂上c种不同的颜色,问等价类数目 首先我们不考虑翻转 假设一次旋转k个位置 那么循环个数显然是Gcd(n,i) 现在考虑翻转 易知所有的置换都可以由[沿着某个固定的对称轴翻转]和[旋转]两步组成 观察一个环 比如我们将对称轴设定为1号节点与圆心的连线 一次旋转k个位置 那么每次置换x会被换到((n+2)-x+k-1)%n+1的位置 我们会发现置换两次之后x就回到了原位 乍一看每个置换都是(AB)(CD)(EF)这样的形式 但是我们忽视了可能一个点

poj 1286 Necklace of Beads &amp; poj 2409 Let it Bead(初涉polya定理)

http://poj.org/problem?id=1286 题意:有红.绿.蓝三种颜色的n个珠子,要把它们构成一个项链,问有多少种不同的方法.旋转和翻转后相同的属于同一种方法. polya计数. 搜了一篇论文Pólya原理及其应用看了看polya到底是什么东东,它主要计算全部互异的组合的个数.对置换群还是似懂略懂.用polya定理解决问题的关键是找出置换群的个数及哪些置换群,每种置换的循环节数.像这种不同颜色的珠子构成项链的问题可以把N个珠子看成正N边形. Polya定理:(1)设G是p个对象

POJ 2409 Let it Bead(Polya简单应用)

Let it Bead 大意:给你m种颜色,n个珠子串起来,旋转跟反转相同算相同,问有多少种不同的涂色组合方式. 思路:Polya的简单应用. 1 /************************************************************************* 2 > File Name: POJ2409.cpp 3 > Author: GLSilence 4 > Created Time: 2014年07月29日 星期二 22时56分58秒 5 **

POJ 2409 Let it Bead

这个题和POJ 1286 是一个题,只不过那是一个颜色数量固定的题而这个不固定. 这是链接:POJ 1286 Necklace of Beads   下面是代码: #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #

poj 1286 Necklace of Beads &amp;amp; poj 2409 Let it Bead(初涉polya定理)

http://poj.org/problem?id=1286 题意:有红.绿.蓝三种颜色的n个珠子.要把它们构成一个项链,问有多少种不同的方法.旋转和翻转后同样的属于同一种方法. polya计数. 搜了一篇论文Pólya原理及其应用看了看polya究竟是什么东东.它主要计算所有互异的组合的个数.对置换群还是似懂略懂.用polya定理解决这个问题的关键是找出置换群的个数及哪些置换群,每种置换的循环节数.像这样的不同颜色的珠子构成项链的问题能够把N个珠子看成正N边形. Polya定理:(1)设G是p

poj 2409+2154+2888(Burnside定理)

三道burnside入门题: Burnside定理主要理解置换群置换后每种不动点的个数,然后n种不动点的染色数总和/n为answer. 对于旋转,旋转i个时不动点为gcd(n,i). 传送门:poj 2409 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <cstdlib> #de

POJ 2409 Let it Bead [置换群 Polya]

传送门 题意:$m$种颜色$n$颗珠子,定义旋转和翻转两种置换,求不等价着色数 暴力求每个置换的循环节也许会$T?$ 我们可以发现一些规律: 翻转: $n$为奇数时每个置换有$1+\frac{n-1}{2}$个循环 $n$为偶数时穿过点的对称有$\frac{n}{2}$个循环,穿过边的有$\frac{n}{2}+1$个循环 旋转: 旋转$i$次的置换的循环个数为$gcd(n,i)$ 可以这样想,从一个点开始每次走$i$步最后走到原位的最少步数$a$就是一个循环的长度 $ ai \equiv \p