1. 程式人生 > >POJ1286 - Necklace of Beads

POJ1286 - Necklace of Beads

script 同構 正整數 std 整數 lse ble ++ ref

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