POJ 2409 Let it BeadPolya定理(模板题)

Posted 00isok

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2409 Let it BeadPolya定理(模板题)相关的知识,希望对你有一定的参考价值。

<题目链接>

题目大意:
用k种颜色对n个珠子构成的环上色,旋转、翻转后相同的只算一种,求不等价的着色方案数。

解题分析:

对于这种等价计数问题,可以用polay定理来解决,本题是一道polay定理的模板题。

具体polay定理的实现步骤如下(选自算法入门经典训练指南  147页):

技术分享图片

 

#include<iostream>
#include<stdio.h>
using namespace std;
typedef long long LL;
int n, m;

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

LL pow(LL a, LL b) {       //快速幂
    LL ans;
    for (ans = 1; b; b >>= 1) {
        if (b & 1)
            ans *= a;
        a *= a;
    }
    return ans;
}

int main() {
    int i, j;
    while (scanf("%d%d", &m, &n) ,n||m) 
    {
        LL ans = 0;

        //旋转的情况 
        for (i = 0; i < n; i++)
            ans = ans + pow((LL) m, (LL) gcd(n, i));

        //翻转的情况
        if (n & 1)
            ans += n * pow((LL) m, (LL) n / 2 + 1);            //若n为奇数,以一个顶点和另外一条边中点的连线为对称轴
        else
            ans += n / 2 * (pow((LL) m, (LL) n / 2) + pow((LL) m, (LL) n / 2 + 1)); //n为偶数时,以两个顶点连线为对称轴  和  以两个顶点之间的连线为对称轴的情况
        
        printf("%lld
", ans /(2*n));       //(2*n)==n+n(n为奇数)或者是n+(n/2+n/2)
    }
    return 0;
}

 

 

2018-08-11


以上是关于POJ 2409 Let it BeadPolya定理(模板题)的主要内容,如果未能解决你的问题,请参考以下文章

[POJ2409]Let it Bead - Polya定理

POJ 2409 Let it Bead(置换burnside引理)

POJ 2409-Let it Bead(Polya计数)

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

POJ2409 Let it Bead

POJ2409Let it Bead Pólya定理