POJ 1286 Necklace of Beads

Posted on 2017-01-12 21:28  ziliuziliu  阅读(118)  评论(0编辑  收藏  举报

Polya定理。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long tab[50],n,ans=0;
long long gcd(long long a,long long b)
{
    if (!b) return a;
    return gcd(b,a%b);
}
int main()
{
    tab[0]=1;for (long long i=1;i<=24;i++) tab[i]=tab[i-1]*3;
    for (;;)
    {
        scanf("%lld",&n);
        if (!n) {printf("0\n");continue;}
        if (n==-1) break;
        ans=0;
        for (long long i=0;i<=n-1;i++)
            ans+=tab[gcd(i,n)];
        if (n&1) ans+=n*tab[n/2+1];
        else ans+=(n/2)*tab[n/2+1]+(n/2)*tab[n/2];
        ans/=2*n;
        printf("%lld\n",ans);
    }
    return 0;
}