串珠子

题源:
题意:
对 \(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';
    }
}
    我不想就这样沦陷,迷失在黑夜,我将燃烧这生命,就算再壮烈。

 数据范围比较小,比较入门的一道题。
        数据范围比较小,比较入门的一道题。
     
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号