码迷,mamicode.com
首页 > 其他好文 > 详细

POJ1286 - Necklace of Beads

时间:2018-05-25 00:19:58      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:http   lse   div   type   desc   一半   ret   两种   AC   

Portal

Description

给出一个正整数\(n(n\leq23)\),求用三种颜色对一个\(n\)个点的环染色的方案数。如果两种方案能够通过旋转/翻转来得到,则视为一种方案(即旋转同构,翻转同构)。

Solution

Polya裸题。
\(G\)的由\(n\)个旋转置换和\(n\)个翻转置换构成。考虑每个置换的轮换数。
对于顺时针旋转\(x\)个点的一个旋转置换,其轮换数为\(gcd(x,n)\)。当\(n\)为奇数时,每个翻转置换的轮换数为\(\dfrac{n+1}{2}\);当\(n\)为偶数时,有一半翻转置换的轮换数为\(\dfrac{n}{2}+1\),另一半的轮换数为\(\dfrac{n}{2}\)

Solution

//Necklace of Beads
#include <cstdio>
typedef long long lint;
int gcd(int x,int y) {return y?gcd(y,x%y):x;}
lint pow(int x,int y)
{
    lint r=1,t=x;
    for(int i=y;i;i>>=1,t*=t) if(i&1) r*=t;
    return r;
}
int main()
{
    while(true)
    {
        int n; scanf("%d",&n);
        if(n==0) {printf("0\n"); continue;}
        if(n<0) break;
        lint ans=0;
        for(int i=1;i<=n;i++) ans+=pow(3,gcd(i,n));
        if(n&1) ans+=n*pow(3,n+1>>1);
        else ans+=2*n*pow(3,n>>1);
        printf("%lld\n",ans/n/2);
    }
    return 0;
}

POJ1286 - Necklace of Beads

标签:http   lse   div   type   desc   一半   ret   两种   AC   

原文地址:https://www.cnblogs.com/VisJiao/p/POJ1286.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!