poj 2409 Let it Bead(polya)

来源:互联网 发布:图片html源码怎么看 编辑:程序博客网 时间:2024/06/05 20:16

m种颜色给n个珠子染色,n个珠子围成了一圈,具有对称性的计数,裸的polya。

#include <stdio.h>int m,n;int gcd(int a, int b){    if(b == 0) return a;    return gcd(b,a%b);}int pow(int a, int b){    int ret = 1;    while(b)    {        if(b&1) ret = ret*a;        a = a*a;        b >>= 1;    }    return ret;}int main(){    int sum;    while(scanf("%d %d",&m,&n) && m+n)    {        sum = 0;        //n种旋转的情况        for(int i = 1; i <= n; ++i)        {            int tmp = gcd(n,i);            sum += pow(m,tmp);        }        //反转的情况        if(n&1)            sum += n*pow(m,(n+1)/2);        else        {            sum += (n/2)*pow(m,(n+2)/2);            sum += (n/2)*pow(m,n/2);        }        sum = sum/(2*n);//旋转有n个置换,翻转有n个置换        printf("%d\n",sum);    }    return 0;}