串珠子

题源:

acw3136.

题意:

\(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';
    }
}
posted @ 2021-08-10 17:16  Z_char  阅读(86)  评论(0编辑  收藏  举报