传送门: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;
}