「POJ2409」Let it Bead
Description
A bracelet is a ring-like sequence of s beads each of which can have one of c distinct colors. The ring is closed, i.e. has no beginning or end, and has no direction. Assume an unlimited supply of beads of each color. For different values of s and c, calculate the number of different bracelets that can be made.
Input
Output
Sample Input
1 2 3 4 5 6 7 8 |
1 1 2 1 2 2 5 1 2 5 2 6 6 2 0 0 |
Sample Output
1 2 3 4 5 6 7 |
1 2 3 5 8 13 21 |
转自http://www.cnblogs.com/DrunBee/archive/2012/09/10/2678378.html
题意:用k种颜色对n个珠子构成的环上色,旋转翻转后相同的只算一种,求不等价的着色方案数。
Burnside定理的应用:
当n为奇数时,有n种翻转,每种翻转都是以一个顶点和该顶点对边的中点对称。有k^(n/2+1)*n种。
当n为偶数时,有n种翻转,其中一半是以两个对应顶点,另一半是以两条对边对称。有k^(n/2+1)*n/2+k^(n/2)*n/2种。
考虑旋转:枚举旋转角度360/n*i,(0<i<=n),也就是一个置换。经过该置换,颜色仍保持不变的着色方案有k^GCD(n,i)种。
一个长度为n的环,每i个上同一种颜色,可以上多少种颜色。
假设起点在x,则x,x+i,x+2*i,……,x+k*i,……
假设在第t次,第一次回到起点,则x=(x+t*i)%n => t*i%n=0 => t=LCM(i,n)/i=n*i/GCD(n,i)/i=n/GCD(n,i)。
那么可以上n/t种颜色,即n/(n/GCD(n,i))种,所以旋转的着色方案有k^GCD(n,i)种。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#include<set> #include<map> #include<ctime> #include<queue> #include<cmath> #include<cstdio> #include<vector> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define mod 20101009 #define inf 1000000000 #define ll long long using namespace std; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n,K; ll ans; ll qpow(ll a,ll b) { ll ans=1; for(ll i=b;i;i>>=1,a=a*a) if(i&1)ans=ans*a; return ans; } ll gcd(ll a,ll b) { return b==0?a:gcd(b,a%b); } int main() { while(1) { K=read();n=read(); if(!n&&!K)break; ans=0; for(int i=1;i<=n;i++) ans+=qpow(K,gcd(i,n)); if(n&1) { ans+=qpow(K,n/2+1)*n; } else { ans+=qpow(K,n/2)*n/2+qpow(K,n/2+1)*n/2; } printf("%lld\n",ans/(2*n)); } return 0; } |