[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 beads. Their PR department found out that customers are interested in buying colored bracelets. However, over 90 percent
of the target audience insists that the bracelets be unique. (Just imagine what happened if two women showed up at the same party wearing identical bracelets!) It‘s a good thing that bracelets can have different lengths and need not be made of beads of one
color. Help the boss estimating maximum profit by calculating how many different bracelets can be produced.

A bracelet is a ring-like sequence of s beads each of which can have one of c distinct colors. The ring is closed, i.e. has no beginning or end, and has no direction. Assume an unlimited supply of beads of each color. For different values of s and c, calculate
the number of different bracelets that can be made.

Input

Every line of the input file defines a test case and contains two integers: the number of available colors c followed by the length of the bracelets s. Input is terminated by c=s=0. Otherwise, both are positive, and, due to technical difficulties in the bracelet-fabrication-machine,
cs<=32, i.e. their product does not exceed 32.

Output

For each test case output on a single line the number of unique bracelets. The figure below shows the 8 different bracelets that can be made with 2 colors and 5 beads.

Sample Input

1 1
2 1
2 2
5 1
2 5
2 6
6 2
0 0

Sample Output

1
2
3
5
8
13
21

Source

Ulm Local 2000

解题思路:

第一道Polya计数题,感觉还是不太懂。。群那一块太抽象了。。

本题是给定颜色种数c和环上的珠子数n,问有多少种染色方案(通过旋转和翻转相同算同一种)最后的结果不会int类型数据表示的范围。

要考虑两种情况:

1.旋转。

将环顺时针旋转i格后,循环节个数为gcd(n,i), 染色方案为  ∑c^gcd(n,i)    其中 i=1,2,3,4,....n

2.翻转。

这里也得考虑两种情况。

当n为奇数时,共有n个循环节个数为(n/2+1)的循环群,还有的资料上说是环的个数为(n/2+1)
,注意这是计算机上的表示,n/2整型相除计算机得到的是整数,其实应该写成(n+1)/2。,染色方案为  n*c^(n/2+1)

为什么n个循环节个数为(n/2+1)的循环群呢?我的理解是这样的,或许不太对。。。

拿正三角形为例,给它三个顶点染色, 对称轴是一个顶点与其对边终点连线所在的直线,这样的直线有3(n=3,即n个顶点) 条,共有3(n)个循环群。假设第一个顶点在对称轴上,那么第二个顶点经过对称轴翻转肯定和第三个顶点重合,那么
(2,3)是一个循环节,(1)自己是一个循环节,循环节个数为2,即(n+1/2)。

当n为偶数时,共有n个循环群,其中有n/2个的循环节个数为(n/2 +1), 有n/2个的循环节个数为(n/2)。

拿正方形为例,四个顶点从左上角顺时针编号1,2,3,4.

当以1,3顶点连线所在直线为对称轴时(对角的两个顶点),这样对称轴有2个(n/2),经过翻转,2,4
重合,1和1重合,3和3重合,那么循环节的个数为3(2,4) (1)(3), 即(n/2+1)。 染色方案为  (n/2)*c^(n/2+1)

当以两条相对平行的边的中点连线所在直线为对称轴时,比如以线段1,2的中点和3,4的中点连线的所在直线为对称轴,这样的对称轴有两个(n/2),经过翻转,1,2重合,3,4重合,循环节的个数为2,(1,2)(3,4),即(n/2)。,也就是谁和谁重合,谁就和谁在一个循环节里。染色方案为(n/2)*c^(n/2)

代码:

#include <iostream>
#include <string.h>
using namespace std;
int c,n;//c种颜色,n个珠子
int ans;

int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}

int power(int p,int n)
{
    int ans=1;
    while(n)
    {
        if(n&1)
            ans*=p;
        p*=p;
        n/=2;
    }
    return ans;
}

int main()
{
    while(cin>>c>>n&&(c||n))
    {
        ans=0;
        for(int i=1;i<=n;i++)
            ans+=power(c,gcd(n,i));
        if(n&1)//是奇数,有n个包含(n/2+1)个循环节的循环群
            ans+=n*power(c,n/2+1);
        else
            ans+=(power(c,n/2+1)+power(c,n/2))*(n/2);
        ans/=2*n;//别忘了处以置换群的总个数
        cout<<ans<<endl;
    }
    return 0;
}

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

时间: 2025-01-31 00:28:30

[ACM] POJ 2409 Let it Bead (Polya计数)的相关文章

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

[ACM] POJ 1286 Necklace of Beads (Polya计数,直接套公式)

Necklace of Beads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6547   Accepted: 2734 Description Beads of red, blue or green colors are connected together into a circular necklace of n beads ( n < 24 ). If the repetitions that are pro

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

NYOJ 280 LK的项链  :click here POJ 2409 Let it Bead:click here 题意:一盒有红.蓝.绿三种颜色的珠子,每种颜色珠子的个数都大于24,现在LK想用这一盒珠子穿出一条项链,项链上的珠子个数为n(0<=n<=24),请你帮她计算一下一共可以用这一盒珠子可以穿出多少条不同的项链.通过旋转.翻转达到同一种状态的被认为是相同的项链. poj 上是c种颜色,s个珠子组成,数据比24小. 思路:今天刚接触到polya 定理: Polya定理:设G是n个对

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 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

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)这样的形式 但是我们忽视了可能一个点