poj 2049(polya)

来源:互联网 发布:php提交表单发送邮件 编辑:程序博客网 时间:2024/06/04 00:41

poj 2049

题目大意:m种颜色给长度为n的项链上色,要求旋转、翻转重合算一种,求总数;

polya : 1|G| * (mc(a1) + mc(a2) +…+ mc(an))

旋转:c(ai) = gcd(n, i)
翻转:
n 为奇数,共有n个循环节数为(n + 1) / 2的循环群;
n为偶数, 共有n / 2个循环节数为(n + 2) / 2的循环群,n / 2个循环节数为n / 2;

#include <iostream>#include <cmath>using namespace std;int gcd(int a, int b){    return (b == 0) ? a : gcd(b, a % b);}int main(){    int n, m;    while (~scanf("%d%d", &m, &n))    {        if (n == 0 && m == 0)        {            break;        }        int sum = 0;        for (int i = 1; i <= n; i++)        {            int tmp = gcd(n, i);            sum += (int)(pow(m * 1.0, tmp * 1.0));        }        if (n & 1)        {            sum += (int)(n * pow(m * 1.0, (n + 1) / 2.0));        }        else        {            sum += (int)((n / 2) * pow(m * 1.0, (n + 2) / 2.0));            sum += (int)((n / 2) * pow(m * 1.0, n / 2.0));        }        sum /= (2 * n);        printf("%d\n", sum);    }    return 0;}
0 0