串珠子
题源:
题意:
对 \(n\) 长度,有 \(m\) 种颜色的手链计数,旋转或翻转相同的算同一种。
\(\rm Analysis:\)
考虑钦定一个位置为 \(0\) 位置,从这里开始填色,如果没有旋转和翻转为同种的限制,乘法原理即可,现在我们考虑带限制的。
\(\rm burnside\) 引理,考虑所有的置换,并对置换的不动点计数即可。
\(\rm Code:\) 头文件和一些比较模板的函数省略,看名字即可分辨
using i64 = long long;
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int m, n;
while (std::cin >> m >> n, n || m) {
i64 res = 0;
for (int i = 0; i < n; ++i)
res += pwer(m, gcd(n, i));
if (n & 1)
res += n * pwer(m, n / 2 + 1);
else
res += n / 2 * pwer(m, n / 2) + n / 2 * pwer(m, n / 2 + 1);
std::cout << res / 2 / n << '\n';
}
}
我不想就这样沦陷,迷失在黑夜,我将燃烧这生命,就算再壮烈。