原题链接:传送门
/* Polya定理
c种颜色染 n个对象
方案数 L = 1/n * (∑(c^g)) g是置换gi的循环节数
置换分为旋转和翻转两种方式
旋转i格时,循环节为 gcd(n,i)
翻转时要考虑n的奇偶,n为奇数时:循环节为(n+1)/2 * 循环群 n 个
n为偶数时(举正方形):循环群有两类,按边中点 循环节为 n/2 * 循环群 n/2
按对角线 循环节数为 (n+1)/2 * 循环群 n/2
*/
// #include <bits/stdc++.h>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
int gcd(int a,int b){
if(b == 0)
return a;
else return gcd(b,a%b);
}
ll Pow(int a,int b){
ll res = 1,base = a;
while(b){
if(b&1)
res *= base;
base *= base;
b >>= 1;
}
return res;
}
int main(){
int s,c;
while(~scanf("%d%d",&c,&s)){
if(s == 0 && c == 0)
break;
ll ans = 0;
for(int i=0;i<s;i++){
ans += Pow(c,gcd(s,i)); //旋转 ∑ c^gcd(n,i);
} //
if(s & 1){
ans += s * Pow(c,s/2+1); //翻转 ∑ s*c^g;
}
else //偶数有两种翻转情况
ans += s/2 * (Pow(c,s/2) + Pow(c,s/2+1) );
printf("%lld\n",ans/(2*s));
}
return 0;
}