题意

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

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

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

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

\((1 \le n \le 50, 1 \le m \le 10)\)

题解

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

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

Polya定理 : $$L=\frac{1}{|G|}\sum \limits _{i=1} ^{|G|} m^{c(g_i)}$$

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

  • 首先考虑旋转 :

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

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

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

    元素标号就为\(0,i \bmod n, 2i \bmod n, ... , (t-1)i \bmod n\).

    所以就有\(t \cdot i \bmod n = 0\),即有\(t \cdot i = n \cdot k\). 使等式左右成立的最小正整数就为\(\mathrm{lcm} (n, i)\).

    那么\(t \cdot i = \mathrm{lcm}(n,i)\)所以\(\displaystyle t=\frac{\mathrm{lcm}(n,i)}{i}=\frac{n}{\gcd(n,i)}\). 那么循环节个数就是\(\displaystyle \frac{n}{t}=\gcd(n,i)\).

    所以这些置换的贡献就是\(a=\sum \limits_{i=0}^{n-1} m^{\gcd(i,n)}\).

  • 再考虑一下翻转 :

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

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

    所以这些置换的贡献就是 \(\displaystyle b=\begin{cases}n \cdot m^{\frac{n+1}{2}} & (m \ is \ odd)\\ \frac{n}{2}\cdot (m ^ {\frac{n}{2}+1}+m^{\frac{n}{2}}) &(m\ is\ even)\end{cases}\)

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

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

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

代码

  1. #include <bits/stdc++.h>
  2. #define For(i, l, r) for(register int i = (l), _end_ = (int)(r); i <= _end_; ++i)
  3. #define Fordown(i, r, l) for(register int i = (r), _end_ = (int)(l); i >= _end_; --i)
  4. #define Set(a, v) memset(a, v, sizeof(a))
  5. using namespace std;
  6. typedef long long ll;
  7. bool chkmin(int &a, int b) {return b < a ? a = b, 1 : 0;}
  8. bool chkmax(int &a, int b) {return b > a ? a = b, 1 : 0;}
  9. void File() {
  10. #ifdef zjp_shadow
  11. freopen ("10294.in", "r", stdin);
  12. freopen ("10294.out", "w", stdout);
  13. #endif
  14. }
  15. const int N = 55;
  16. ll n, t, Pow[N], a, b;
  17. int main () {
  18. File();
  19. while (~scanf("%lld%lld", &n, &t) && n) {
  20. Pow[0] = 1;
  21. a = b = 0;
  22. for (int i = 1; i <= n; ++i) Pow[i] = Pow[i - 1] * t;
  23. for (int i = 0; i < n; ++ i) a += Pow[__gcd(i, (int)n)];
  24. if (n & 1) b = n * Pow[n / 2 + 1];
  25. else b = n / 2 * (Pow[n / 2 + 1] + Pow[n / 2]);
  26. printf ("%lld %lld\n", a / n, (a + b) / 2 / n);
  27. }
  28. return 0;
  29. }

UVA10294 Arif in Dhaka (群论,Polya定理)的更多相关文章

  1. [Uva10294]Arif in Dhaka

    [Uva10294]Arif in Dhaka 标签: 置换 Burnside引理 题目链接 题意 有很多个珠子穿成环形首饰,手镯可以翻转和旋转,项链只能旋转.(翻转过的手镯相同,而项链不同) 有n个 ...

  2. Uva10294 Arif in Dhaka (置换问题)

    扯回正题,此题需要知道的是置换群的概念,这点在刘汝佳的书中写的比较详细,此处不多做赘述.此处多说一句的是第二种手镯的情况.在下图中“左图顺时针转1个位置”和“右图顺时针旋转5个位置”是相同的,所以在最 ...

  3. UVA10294 Arif in Dhaka (First Love Part 2) —— 置换、poyla定理

    题目链接:https://vjudge.net/problem/UVA-10294 题解: 白书P146~147. 为什么旋转i个间距,就有gcd(i,n)个循环,且每个循环有n/gcd(i,n)个元 ...

  4. UVA10294 Arif in Dhaka (First Love Part 2)

    题意 PDF 分析 用n颗宝石串成项链和手镯, 每颗宝石的颜色可以t种颜色中的一种,当A类项链经过旋转得B类项链时,A和B属于一类项链, 而手镯不仅可以旋转还可以翻转,当A类手镯经过翻转得得到B类手镯 ...

  5. 【uva 10294】 Arif in Dhaka (First Love Part 2) (置换,burnside引理|polya定理)

    题目来源:UVa 10294 Arif in Dhaka (First Love Part 2) 题意:n颗珠子t种颜色 求有多少种项链和手镯 项链不可以翻转 手镯可以翻转 [分析] 要开始学置换了. ...

  6. Arif in Dhaka (First Love Part 2) UVA - 10294(Polya定理)

    这题和POJ-1286一样 题意: 给出t种颜色的n颗珠子 (每种颜色的珠子个数无限制,但总数必须是n), 求能制作出项链和手镯的个数 注意手镯可以翻转和旋转  而 项练只能旋转 解析: 注意Poly ...

  7. UVa 10294 Arif in Dhaka (First Love Part 2) (Polya定理)

    题意:给定 n 和 m 表示要制作一个项链和手镯,项链和手镯的区别就是手镯旋转和翻转都是相同的,而项链旋转都是相同的,而翻转是不同的,问你使用 n 个珠子和 m 种颜色可以制作多少种项链和手镯. 析: ...

  8. 【群论】polya定理

    对Polya定理的个人认识     我们先来看一道经典题目:     He's Circles(SGU 294)         有一个长度为N的环,上面写着“X”和“E”,问本质不同的环有多少个(不 ...

  9. [bzoj1488][HNOI2009]图的同构——Polya定理

    题目大意 求两两互不同构的含n个点的简单图有多少种. 简单图是关联一对顶点的无向边不多于一条的不含自环的图. a图与b图被认为是同构的是指a图的顶点经过一定的重新标号以后,a图的顶点集和边集能完全与b ...

随机推荐

  1. 关于字符型char变量

    写程序时,意外发现个很不容易察觉问题出在哪的问题的 scanf("%c",&ch); scanf("%c",&c); printf(" ...

  2. C++函数返回值发生的对象复制

    最近用QT做一个监控系统的项目,需要显示目标的运动轨迹,每次目标移动后,就在目标的轨迹中(用vector记录)添加一条新轨迹. 但是在运行中画面里一直不出现轨迹,经过调试发现是记录轨迹的函数出错了. ...

  3. 记录一次CentOS环境升级Python2.6到Python2.7并安装最新版pip

    背景介绍 一次实验中需要安装python-etcd包.安装这个包时要求的python和pip版本比目前系统的版本高. 系统是centos6.6    64位 1 2 3 4 5 6 7 [root@m ...

  4. R语言-来自Prosper的贷款数据探索

    案例分析:Prosper是美国的一家P2P在线借贷平台,网站撮合了一些有闲钱的人和一些急用钱的人.用户若有贷款需求,可在网站上列出期望数额和可承受的最大利率.潜在贷方则为数额和利率展开竞价. 本项目拟 ...

  5. R语言-聚类与分类

    一.聚类: 一般步骤: 1.选择合适的变量 2.缩放数据 3.寻找异常点 4.计算距离 5.选择聚类算法 6.采用一种或多种聚类方法 7.确定类的数目 8.获得最终聚类的解决方案 9.结果可视化 10 ...

  6. Nginx的gzip压缩的原理和设置参数

    开启Nginx gzip压缩非常简单,达到的效果可以压缩静态文件大小.提高页面访问速度.节省流量和带宽是很有帮助的,也为用户省去了很多流量:唯一的不足就是开启之后服务器这边会增加运算,进行压缩运算处理 ...

  7. Qt 动态加载DLL 常见错误有哪些?

    1. dll 路径不对,比如 IE 中 2. 依赖库缺失,会报错找不到指定模块 注意: qt 的 qlibrary 只能加载 标准 C 函数

  8. aforge 学习-基本图像处理要用的类库

    1.图像灰度化:Grayscale.CommonAlgorithms.BT709(3种) FiltersSequence =new  FiltersSequence(数组处理函数): 2.二值化(阈值 ...

  9. ANTD mobile源码分析 -- popover

    最近的开发中要用到很多的各式各样的组件.但是发现ant design mobile(后面简称ANTDM)里很多的资源.于是就分析一下,学习学习. ANTDM直接使用了typescript,没有用ES2 ...

  10. 使用lambda编程之延迟执行

    使用lambda表达式的主要原因是,将代码的执行延迟到一个合适的时间点. 所有的lambda表达式都是延迟执行的.毕竟,如果你希望立即执行一段代码,那就没有必要使用lambda表达式了.延迟执行代码的 ...