UVA10294 Arif in Dhaka (群论,Polya定理)

题意

给你一个长为n的项链和手镯,每个珠子有m种颜色.

两个手镯定义为相同,即它们通过翻转和旋转得到一样的手镯.

两个项链定义为相同,即它们只能通过旋转得到一样的项链.

求出有多少种本质不同的项链和手镯.

(1n50,1m10)

题解

(参考了一下这篇大佬博客)

大白书上的原题,一个裸的Polya定理(逃

Polya定理 : L=1|G|i=1|G|mc(gi)

其中G={g1,...,gs} c(gi)为置换gi的循环节个数, L为本质不同的方案数, m 是可以选择的颜色种数.

  • 首先考虑旋转 :

    假设当前旋转i颗珠子,那么就有gcd(n,i)个循环,每个循环长度则为ngcd(n,i).

    这个证明同样参考了之前那篇博客....(我用 LATEX 再打一下..)

    将珠子从0n1标号,那么对于旋转i位的置换,在以0号为起点,长度为t的一个循环节,

    元素标号就为0,imodn,2imodn,...,(t1)imodn.

    所以就有timodn=0,即有ti=nk. 使等式左右成立的最小正整数就为lcm(n,i).

    那么ti=lcm(n,i)所以t=lcm(n,i)i=ngcd(n,i). 那么循环节个数就是nt=gcd(n,i).

    所以这些置换的贡献就是a=i=0n1mgcd(i,n).

  • 再考虑一下翻转 :

    这个要分序列奇偶性分别考虑,应该是比较好考虑的.

    1. 如果长度n为奇数,那么我们就只能沿着一个珠子翻转,那么就有n12个长度为2的等价类 和 1个长度为1的等价类.
    2. 如果长度n为偶数,那么我们就有两种方式.沿着两个珠子翻转,那么就有n22个长度为2的等价类和2个长度为1的等价类. 否则我们沿着两个珠子中间来翻转,那么就有n2个长度为2的等价类.

    所以这些置换的贡献就是 b={nmn+12(m is odd)n2(mn2+1+mn2)(m is even)

这样的话似乎会漏算情况(hany01大大问了下我)然后还是前面那篇大佬博客上有解释.

就是旋转再翻转的情况,肯定是其中另一种翻转.这也是因为群有封闭性,不管怎样(二元运算)都是群内的元素.

最后要除以一个|G|,项链只有n个置换群,手镯有2n个啦.

代码

#include <bits/stdc++.h> #define For(i, l, r) for(register int i = (l), _end_ = (int)(r); i <= _end_; ++i) #define Fordown(i, r, l) for(register int i = (r), _end_ = (int)(l); i >= _end_; --i) #define Set(a, v) memset(a, v, sizeof(a)) using namespace std; typedef long long ll; bool chkmin(int &a, int b) {return b < a ? a = b, 1 : 0;} bool chkmax(int &a, int b) {return b > a ? a = b, 1 : 0;} void File() { #ifdef zjp_shadow freopen ("10294.in", "r", stdin); freopen ("10294.out", "w", stdout); #endif } const int N = 55; ll n, t, Pow[N], a, b; int main () { File(); while (~scanf("%lld%lld", &n, &t) && n) { Pow[0] = 1; a = b = 0; for (int i = 1; i <= n; ++i) Pow[i] = Pow[i - 1] * t; for (int i = 0; i < n; ++ i) a += Pow[__gcd(i, (int)n)]; if (n & 1) b = n * Pow[n / 2 + 1]; else b = n / 2 * (Pow[n / 2 + 1] + Pow[n / 2]); printf ("%lld %lld\n", a / n, (a + b) / 2 / n); } return 0; }

__EOF__

本文作者zjp_shadow
本文链接https://www.cnblogs.com/zjp-shadow/p/8478216.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   zjp_shadow  阅读(390)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示