HDU 1817Necklace of Beads(置换+Polya计数)

Necklace of Beads

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Submit Status Practice HDU 1817

Description

Beads of red, blue or green colors are connected together into a circular necklace of n beads ( n < 40 ). If the repetitions that are produced by rotation around the center of the circular necklace or reflection to the axis of symmetry are all neglected, how many different forms of the necklace are there?

Input

The input has several lines, and each line contains the input data n. 
-1 denotes the end of the input file.

Output

The output should contain the output data: Number of different forms, in each line correspondent to the input data.

Sample Input

4
5
-1

Sample Output

21
39

题目大意:

n个珠子串成一个圆,用三种颜色去涂色。问一共有多少种不同的涂色方法。

不同的涂色方法被定义为:如果这种涂色情况翻转,旋转不与其他情况相同就为不同。

 

解题思路:

Polya定理模版题。

对于顺时针长度为i的旋转,为pow(3, gcd(n,i);

对于翻转,当为奇数时,有:n*pow(3, n/2+1); 

   当为偶数时,有:n/2*pow(3.0,n/2)+n/2*pow(3.0,n/2+1);

一共有2*n种情况,最后要除以2*n

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <cmath>
 6 using namespace std;
 7 typedef long long LL;
 8 int n;
 9 LL Pow(LL a, LL b) // 手写long long
10 {
11     LL res = 1;
12     for (int i = 0; i < b; i++)
13         res *= a;
14     return res;
15 }
16 int gcd(int a, int b)
17 {
18     if (a == 0)
19         return b;
20     return gcd(b % a, a);
21 }
22 int main()
23 {
24     while (scanf("%d", &n) != EOF && n != -1)
25     {
26         if (n == 0)
27         {
28             printf("0\n");
29             continue;
30         }
31         LL ans = 0;
32         for (int i = 1; i <= n; i++)
33             ans += Pow(3, gcd(i, n));
34
35         if (n & 1)
36         {
37             ans += n * Pow(3, (n + 1) / 2);
38         }
39         else
40         {
41             ans += n / 2 * Pow(3.0, n / 2 + 1);
42             ans += n / 2 * Pow(3.0, n / 2);
43             //ans += n / 2 * (pow(3.0, n / 2 + 1) + pow(3.0, n / 2));
44         }
45         printf("%I64d\n", ans / 2 / n);
46     }
47     return 0;
48 }

时间: 2024-10-15 07:40:08

HDU 1817Necklace of Beads(置换+Polya计数)的相关文章

hdu 1812 Count the Tetris polya计数

哈哈哈,简单polya,公式自己推导. 不过这题需要用到大数,很久没写Java,调了好久. import java.math.*; import java.util.*; import java.io.*; public class Main{ public static void main(String args[]){ Scanner cin=new Scanner(System.in); int n; BigInteger c; while(cin.hasNextInt()) { BigI

poj1286--Necklace of Beads(置换群+polya计数)

题目链接:点击打开链接 题目大意:给出三种颜色红绿蓝,对一串n个小球的环染色,环可以旋转和翻转,问最终可能有多少不同的染色方案. 首先说明polya计数: 由这个公式,既可以计算出不同的染色方案,那么我们需要求的也就是不同置换的个数,和每一个置换的循环节数 旋转,旋转i个小球的距离,那么会得到0-n-1的置换方案,共有n中,对于旋转i个小球的循环节数为gcd(n,i) 翻转,对于偶数,不经过小球有对称抽有n/2个,每种置换方案有n/2+1个循环节:经过小球的对称轴有n/2个,每种置换方案有n/2

[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

HDU 4633(polya计数

题目:用k种颜色给一个魔方染色,可以染每个面的9个小矩形,12条棱,8个顶点(总之就是有74个能染的地方),空间旋转后一样的视为相同,问有多少种不同的染色方案. 思路:裸的polya计数,但是这个立方体的对称群本来就很容易弄错...<组合数学>里有个例题提到立方体的对称群有24个元素,分别是: (1)恒等变换. (2)以两个相对面的中心相连作为对称轴,旋转(i)90,(ii)180,(iii)270度,每种有3个.共9种. (3)以两个相对棱的中点连线为对称轴翻转180度,有6种. (4)固定

Polya计数

Let it Bead Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5365   Accepted: 3585 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

[ACM] POJ 2154 Color (Polya计数优化,欧拉函数)

Color Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7630   Accepted: 2507 Description Beads of N colors are connected together into a circular necklace of N beads (N<=1000000000). Your job is to calculate how many different kinds of th

组合数学及其应用——polya计数

在处理类似下面的问题中,一般的计数方法会出现问题:假如你要用红.蓝两种颜色给一个正四面体的四个顶点着色,试问存在多少种不同的着色方案? 在高中我们常用的方法是模拟涂色过程,分情况讨论,然后基于分步乘法原理.但是在那里没有考虑几何体通过旋转等操作带来的对称性,在本文中,我们就来介绍一种专门处理这类问题的工具——Polya计数. 首先我们要做的是引入一些基本的概念. 置换: 关于置换更多的细节我们在<抽象代数基础教程>中继续讨论,这里我们只需简单的了解其概念即可. 关于置换还需要了解的就是它的合乘

UVALive - 3641 Leonardo&#39;s Notebook(polya计数)

题意:给出26个大写字母的置换B,问是否存在一个置换A,使A*A=B? 两个长度为N的相同循环相乘,当N为奇数时结果也是一个长度为N的循环,当N为偶数时分裂为两个长度为N/2的循环.相反,对于一个任意长度为N的奇数循环B,都能找到一个长度为N的循环A使得A*A=B,对于任意两个长度为N(N不一定为偶数)的不相交循环B和C,都能找到一个长度为2N的循环A使得A*A=B*C. 于是只要判断置换B里循环长度相同的且都为偶数(2,4,6, 8.....)的循环个数是不是都为偶数(偶数就能两两配对),只要

poj 2154 Color(polya计数 + 欧拉函数优化)

http://poj.org/problem?id=2154 大致题意:由n个珠子,n种颜色,组成一个项链.要求不同的项链数目,旋转后一样的属于同一种,结果模p. n个珠子应该有n种旋转置换,每种置换的循环个数为gcd(i,n).如果直接枚举i,显然不行.但是我们可以缩小枚举的数目.改为枚举每个循环节的长度L,那么相应的循环节数是n/L.所以我们只需求出每个L有多少个i满足gcd(i,n)= n/L,就得到了循环节数为n/L的个数.重点就是求出这样的i的个数. 令cnt = gcd(i,n) =