poj 1286 Necklace of Beads

    这是做的第一道群论题,自然要很水又很裸。注意用long long。

    就是用到了两个定理

    burnside :不等价方案数=每个置换的不动置换方案数的和 / 置换个数

    polya: 一个置换的不动置换方案数=k^(这个置换的循环个数) 

    先看第一个博客再看第二个

    http://cxjyxx.me/?p=198

    http://endlesscount.blog.163.com/blog/static/82119787201221324524202/

    这两个蛮好的,上代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

int n;

long long mi(int a)
{
    long long ans = 1, zan = 3;
    while (a)
    {
        if (a & 1) ans *= zan;
        zan *= zan;
        a >>= 1;
    }
    return ans;
}

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

int main()
{
    scanf("%d", &n);
    while (n != -1)
    {
        if (n == 0)
        {
            printf("0\n");
            scanf("%d", &n);
            continue;
        }
        int Gcount = 2*n;
        long long ans = 0;
        for (int i = 1; i <= n; ++i)
        ans += mi(gcd(i,n));
        if (n % 2 == 0) ans += mi(n/2)*n/2 + mi(n/2+1)*n/2;
        else ans += mi(n/2+1)*n;
        printf("%I64d\n", ans / Gcount);
        scanf("%d", &n);
    }
    return 0;
}

 

posted @ 2014-09-03 21:48  handsomeJian  阅读(119)  评论(0编辑  收藏  举报