POJ_2409
这个题目和POJ_1286很像,拿来练一下刚学的polya定理。
#include<stdio.h>
#include<string.h>
#define MAXD 35
long long int elem[MAXD];
int C, S;
long long int getpow(int i)
{
if(elem[i] != -1)
return elem[i];
return elem[i] = getpow(i - 1) * C;
}
int gcd(int x, int y)
{
return y == 0 ? x : gcd(y, x % y);
}
void solve()
{
int i, j, k;
long long int ans = 0;
memset(elem, -1, sizeof(elem));
elem[0] = 1;
for(i = 0; i < S; i ++)
ans += getpow(gcd(i, S));
if(S % 2)
ans += S * getpow(S / 2 + 1);
else
{
ans += S / 2 * getpow(S / 2);
ans += S / 2 * getpow(S / 2 + 1);
}
ans /= S + S;
printf("%lld\n", ans);
}
int main()
{
for(;;)
{
scanf("%d%d", &C, &S);
if(!C && !S)
break;
solve();
}
return 0;
}