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

http://poj.org/problem?id=1286

题意:有红、绿、蓝三种颜色的n个珠子。要把它们构成一个项链,问有多少种不同的方法。旋转和翻转后同样的属于同一种方法。

polya计数。

搜了一篇论文Pólya原理及其应用看了看polya究竟是什么东东。它主要计算所有互异的组合的个数。对置换群还是似懂略懂。用polya定理解决这个问题的关键是找出置换群的个数及哪些置换群,每种置换的循环节数。像这样的不同颜色的珠子构成项链的问题能够把N个珠子看成正N边形。

Polya定理:(1)设G是p个对象的一个置换群。用k种颜色给这p个对象,若一种染色方案在群G的作用下变为还有一种方案,则这两个方案当作是同一种方案,这种不同染色方案数为:

(2) 对于N个珠子的项链,共同拥有n种旋转置换和n种翻转置换。

对于旋转置换:每种置换的循环节数c(fi) = gcd(n,i)。(i为一次转过多少个珠子)

对于翻转置换:假设n为奇数。共同拥有n种翻转置换。每种置换的循环节数c(f) = n/2 + 1;

              
       假设n为偶数,c(f) = n/2的置换有n/2个; c(f) = n/2 + 1的置换有n/2个。

直接带入公式就KO了。

poj 1286

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#define LL long long
#define _LL __int64
#define eps 1e-8

using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 10;

int n;
_LL ans;

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

int main()
{
	 while(~scanf("%d",&n))
	 {
	 	if(n == -1)
			break;
		if(n == 0) //不考虑n=0的情况,会导致RE
		{
			printf("0\n");
			continue;
		}
		ans = 0;
		// n 种旋转置换

		for(int i = 1; i <= n; i++)
			ans += pow(3.0,gcd(n,i));

		//m种翻转置换

		if(n & 1)
		{
			ans += n * pow(3.0,n/2+1);
		}
		else
		{
			ans += n/2 * pow(3.0,n/2);
			ans += n/2 * pow(3.0,n/2+1);
		}

		ans = ans/2/n;

		printf("%I64d\n",ans);
	 }
	 return 0;
}

poj 2409

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#define LL long long
#define _LL __int64
#define eps 1e-8

using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 10;

int c,s;
_LL ans;

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

int main()
{
	while(~scanf("%d %d",&c,&s))
	{
		if(c == 0 && s == 0) break;
		ans = 0;

		for(int i = 1; i <= s; i++)
			ans += pow(c*1.0,gcd(s,i));

		if(s & 1)
		{
			ans += s * pow(c*1.0,s/2+1);
		}
		else
		{
			ans += s/2 * pow(c*1.0,s/2);
			ans += s/2 * pow(c*1.0,s/2+1);
		}
		ans = ans/2/s;
		printf("%I64d\n",ans);
	}
	return 0;
}
时间: 2025-01-24 22:12:50

poj 1286 Necklace of Beads &amp; poj 2409 Let it Bead(初涉polya定理)的相关文章

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 1286 Necklace of Beads(Polya简单应用)

Necklace of Beads 大意:3种颜色的珠子,n个串在一起,旋转变换跟反转变换如果相同就算是同一种,问会有多少种不同的组合. 思路:正规学Polya的第一道题,在楠神的带领下,理解的还算挺快的,代码没什么好说的,裸的Polya,也不需要优化. 1 /************************************************************************* 2 > File Name: POJ1286.cpp 3 > Author: GLSil

[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

poj 1286 Necklace of Beads

Necklace of Beads 题意:用三种颜色给长度为n(n < 24)的环状手镯涂色,若能通过旋转或翻转得到则表示为同一种,问不同种涂色方案为多少? 思路:纯粹的等价类计算问题: 重点:对旋转和翻转转化为置换操作: 旋转:对间隔的长度进行枚举,即0 <= i < n:这样循环节就为n/gcd(i,n);直接弄成3的幂次方求和即可: 翻转:分奇偶,再求出对称轴的个数和每种情况下循环节的个数即可: 上面求出的a+b只是不动点的个数总和,最后要除以总的置换的个数即2n; #includ

poj 1286 Necklace of Beads (polya(旋转+翻转)+模板)

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 produced by rotation around the center of the circular necklace or reflection to the axis of symmetry ar

数学计数原理(P&#243;lya):POJ 1286 Necklace of Beads

Necklace of Beads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7763   Accepted: 3247 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

POJ 1286 Necklace of Beads(项链的珠子)

Necklace of Beads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7874   Accepted: 3290 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

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 题目1286 Necklace of Beads(Polya定理)

Necklace of Beads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7061   Accepted: 2942 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