当前位置: 代码迷 >> 综合 >> (Polya定理)poj2409 Let it Bead
  详细解决方案

(Polya定理)poj2409 Let it Bead

热度:83   发布时间:2023-11-02 20:21:02.0

传送门:poj2409 Let it Bead

这部分内容看了很久,还是不懂,,,区域赛过后再细细研究吧

详解1  详解2 详解3

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int m,n;int gcd(int a,int b){if(b==0) return a;return gcd(b,a%b);
}/*
给n个珠子涂m种颜色 
显然,对于这n个对象,有n种旋转和n种翻转。
1. 对于旋转,有c(gi) = gcd(n,i),i为转动几颗珠子。
2. 对于翻转,当n为奇数时,c(gi) = n/2+1;当n为偶数时,有n/2个的循环节数为n/2+1,有n/2个的循环节数为n/2。
*/
int main()
{while(~scanf("%d%d",&m,&n)){if(m==0&&n==0) break;int sum=0,tmp;for(int i=1;i<=n;i++){   tmp=gcd(n,i);sum+=pow(m,tmp);   //旋转置换 }if(n&1) sum+=n*pow(m,n/2+1);else{sum+=n/2*pow(m,n/2+1);     //翻转置换 sum+=n/2*pow(m,n/2);}sum=sum/(2*n);printf("%d\n",sum);}return 0;
}