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;

}

 

你可能感兴趣的:(poj)