三色项链
题目链接:ybt金牌导航8-5-3 / poj 1286
题目大意
给你项链珠子的个数,有三种颜色。
然后问你有多少本质不同的项链,如果一个项链可以通过旋转和沿对称轴翻转得到另一个项链,那它们就是本质相同的。
思路
直接用 Polya 定理,然后就旋转和轴对称翻转两类置换。
然后就直接搞即可。
然后注意特判 n = 0 n=0 n=0 的情况,这个时候没有珠子,只有一种情况。
代码
#include<cstdio>
#define ll long long
using namespace std;
int n;
ll ans;
ll ksm(ll x, ll y) {
ll re = 1;
while (y) {
if (y & 1) re = re * x;
x = x * x;
y >>= 1;
}
return re;
}
ll gcd(ll x, ll y) {
if (!y) return x;
return gcd(y, x % y);
}
int main() {
scanf("%d", &n);
while (n != -1) {
if (!n) {
printf("0\n");
scanf("%d", &n);
continue;
}
ans = 0;
for (int i = 1; i <= n; i++) ans += ksm(3, gcd(i, n));
if (n & 1) ans += n * ksm(3, (n + 1) / 2);
else ans += n / 2 * ksm(3, n / 2) + n / 2 * ksm(3, (n + 2) / 2);
printf("%lld\n", ans / (2 * n));
scanf("%d", &n);
}
return 0;
}