这部分内容看了很久,还是不懂,,,区域赛过后再细细研究吧
#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;
}