poj 1286

polya定理的基础题目。置换群中有两种情况。
#include <iostream>
#include <cstdio>
#define LL long long
using namespace std;
const int maxn=30;
LL pow[maxn];
int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}
int main()
{
    pow[1]=3;
    int i;
    for(i=2;i<=24;i++) pow[i]=pow[i-1]*(LL)3;
    int n;
    while(scanf("%d",&n)&&n!=-1)
    {
        if(n==0)
        {
            printf("%d\n",0);
            continue;
        }
        LL ans=0;
        for(i=0;i<n;i++) ans+=pow[gcd(i,n)];//情况一的不动点的个数
        if(n%2) ans+=(LL)n*pow[(n+1)/2];
        else ans+=(LL)(n/2)*(pow[n/2+1]+pow[n/2]);
        printf("%I64d\n",ans/2/n);
    }
    return 0;
}

posted @ 2013-05-05 22:11  LJ_COME!!!!!  阅读(122)  评论(0编辑  收藏  举报