洛谷 P4128: bzoj 1815: [SHOI2006]有色图
题目传送门:洛谷 P4128。
计数好题,原来是 13 年前就出现了经典套路啊。这题在当年应该很难吧。
题意简述:
\(n\) 个点的完全图,点没有颜色,边有 \(m\) 种颜色,问本质不同的图的数量对质数 \(p>n\) 取模。
本质不同指的是在点的 \(n!\) 种不同置换下不同。
题解:
首先有 \(\mathrm{Burnside}\) 引理:一类元素在一个置换群的作用下本质不同的元素(不同等价类)个数等于 \(\displaystyle\frac{1}{|G|}\sum_{g\in G}M(g)\)。其中 \(G\) 是所有置换的集合,\(M(g)\) 是一个置换的不动点个数。
那么我们考虑一个点的置换 \((a_1,a_2,\ldots,a_n)\),因为一个置换可以拆分成不相交循环的乘积,考虑这个置换能拆分成 \(k\) 个长度分别为 \(b_1,b_2,\ldots,b_k\) 的不相交循环的乘积。显然它的不动点个数为 \(m\) 的在这个置换下边的等价类个数次方。如何计算它的边等价类个数?
我们考虑两类边,第一类是端点在同一循环中的边,第二类是端点在不同循环中的边。
对于第一类边,考虑一个长度为 \(b\) 的循环。把 \(b\) 个点按顺序等距分布在一个圆上,在循环作用下每条边都会往顺时针方向位移一格。则容易得到两条边处于不同等价类当且仅当它们长度不同,可以得出长度为 \(b\) 的循环内部共有 \(\displaystyle\left\lfloor\frac{b}{2}\right\rfloor\) 种边的等价类。
对于第二类边,考虑两个长度分别为 \(b_1\) 和 \(b_2\) 的不同循环。对于一条边,在这个置换的重复作用下经过 \(\mathrm{lcm}(b_1,b_2)\) 次操作会回到自身。所以每条边的在一个大小为 \(\mathrm{lcm}(b_1,b_2)\) 的等价类中,则不同等价类的个数为 \(\displaystyle\frac{b_1b_2}{\mathrm{lcm}(b_1,b_2)}=\gcd(b_1,b_2)\)。
综合得到等价类个数为 \(\displaystyle\sum_{i}\left\lfloor\frac{b_i}{2}\right\rfloor+\sum_{i<j}\gcd(b_i,b_j)\)。对于一个求出了 \(b\) 的置换,这个式子可以在 \(\Theta(k^2\log b_i)\) 的时间内求出。
接下来需要对所有置换统计,显然我们不能枚举每个置换,但是可以发现,\(b\) 一样的置换答案也相同。考虑枚举 \(b\),即本质不同的不相交循环长度的可重集。这相当于枚举 \(n\) 的每个整数分拆。本题中 \(n\le 53\),而 \(53\) 的整数分拆数量也不大。
考虑枚举了 \(b_1\le b_2\le \cdots\le b_k\),其中 \(\displaystyle\sum b_i=n\),如何计算它对应了多少种不同的置换呢?
考虑对于 \(1\) 到 \(n\) 的每个点,分配它在第几个循环中,这相当于一个多重组合数 \(\displaystyle\frac{n!}{\prod b_i!}\)。而对于每一个置换,分配它内部的顺序,这相当于一个圆排列,即 \(\prod (b_i-1)!\),结合前面是 \(\displaystyle\frac{n!}{\prod b_i}\)。最后我们会发现这样其实会算重,因为每个循环的前后顺序不影响,不能把 \(1,2\) 和 \(2,1\)(这里表示每个点在第几个循环内)当作不同的循环分配方案。发现只有 \(b_i\) 相同的会影响,假设有 \(c\) 个,正好多乘了 \(c!\) 种方案,除掉就好了。这相当于 \(\displaystyle\frac{n!}{\prod b_i\prod c!}\)。
发现因为有 \(|G|=n!\) 种置换,正好和最后 \(\displaystyle\frac{1}{|G|}\) 抵消了,所以最终的式子是:\(\displaystyle\sum_{b}\frac{1}{\prod b_i\prod c!}m^{\left[\sum_{i}\lfloor\frac{b_i}{2}\rfloor+\sum_{i<j}\gcd(b_i,b_j)\right]}\)。
对于枚举每一种 \(b\),可以直接 DFS。而后面两个东西都是能直接在 DFS 过程中计算的,优化常数。
本题很贴心地保证 \(p>n\),可以放心求阶乘和阶乘逆元。
时间复杂度大约是 \(\displaystyle\mathcal{O}\left(\log n\sum_{p\in\mathrm{Partition}(n)}\mathrm{len}^{2}(p)\right)\),实际比较小,更多可以查看 A296010。
#include <cstdio>
#include <algorithm>
typedef long long LL;
const int MN = 60;
int N, M, P, Sum;
inline int qPow(int b, int e) {
int a = 1;
for (; e; b = (LL)b * b % P, e >>= 1)
if (e & 1) a = (LL)a * b % P;
return a;
}
int Inv[MN], Fac[MN], iFac[MN];
inline void Init(int N) {
Inv[1] = 1;
for (int i = 2; i <= N; ++i) {
Inv[i] = (LL)(P - P / i) * Inv[P % i] % P;
}
Fac[0] = iFac[0] = 1;
for (int i = 1; i <= N; ++i) {
Fac[i] = (LL)Fac[i - 1] * i % P;
iFac[i] = (LL)iFac[i - 1] * Inv[i] % P;
}
}
int stk[MN], t, n1, n2 = 1;
void DFS(int s, int mx, int c) {
if (!s) {
Sum = (Sum + (LL)qPow(M, n1) * n2) % P;
return ;
}
int a = n1, b = n2;
for (int i = 1; i <= mx; ++i) {
stk[++t] = i;
n1 = a + i / 2;
for (int j = 1; j < t; ++j) n1 += std::__gcd(stk[j], i);
n2 = (LL)b * Inv[i] % P;
if (i == stk[t - 1]) n2 = (LL)n2 * Fac[c] % P * iFac[c + 1] % P;
DFS(s - i, std::min(s - i, i), i == stk[t - 1] ? c + 1 : 1);
--t;
}
}
int main() {
scanf("%d%d%d", &N, &M, &P);
Init(N);
DFS(N, N, 0);
printf("%d\n", Sum);
return 0;
}
听说有色图?来了来了!色图在哪里啊?
洛谷 P4128: bzoj 1815: [SHOI2006]有色图的更多相关文章
- 洛谷 P4128 [SHOI2006]有色图 解题报告
P4128 [SHOI2006]有色图 题目描述 如果一张无向完全图(完全图就是任意两个不同的顶点之间有且仅有一条边相连)的每条边都被染成了一种颜色,我们就称这种图为有色图.如果两张有色图有相同数量的 ...
- bzoj 1815: [Shoi2006]color 有色图 置换群
1815: [Shoi2006]color 有色图 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 136 Solved: 50[Submit][Stat ...
- 洛谷 P3307: bzoj 3202: [SDOI2013] 项链
题目传送门:洛谷P3307.这题在bzoj上是权限题. 题意简述: 这题分为两个部分: ① 有一些珠子,每个珠子可以看成一个无序三元组.三元组要满足三个数都在$1$到$m$之间,并且三个数互质,两个珠 ...
- 洛谷 4106 / bzoj 3614 [HEOI2014]逻辑翻译——思路+类似FWT
题目:https://www.luogu.org/problemnew/show/P4106 https://www.lydsy.com/JudgeOnline/problem.php?id=3614 ...
- 洛谷 P3332 BZOJ 3110 [ZJOI2013]K大数查询
题目链接 洛谷 bzoj 题解 整体二分 Code #include<bits/stdc++.h> #define LL long long #define RG register usi ...
- 洛谷 P2486 BZOJ 2243 [SDOI2011]染色
题目描述 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221” ...
- 洛谷 P2827 BZOJ 4721 UOJ #264 蚯蚓
题目描述 本题中,我们将用符号表示对c向下取整,例如:. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现在共有n只蚯蚓(n为正整数).每只 ...
- 洛谷 P2155 BZOJ 2186 codevs 2301 [SDOI2008]沙拉公主的困惑
题目描述 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的 ...
- 洛谷 P2046 BZOJ 2007 海拔(NOI2010)
题目描述 YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个 ...
随机推荐
- 软件工程学习之小学四则混合运算出题软件 Version 1.00 设计思路及感想
对于小学四则混合运算出题软件的设计,通过分析设计要求,我觉得为了这个软件在今后便于功能上的扩充,可以利用上学期所学习的<编译原理>一课中的LL1语法分析及制导翻译的算法来实现.这样做的好处 ...
- 运用visual studio进行简单的单元测试
昨天下午安装了visual studio,本打算晚上进行单元测试的,但当我再打开的时候就让我选择修复或卸载,修复完之后还是不能用,顿时觉得心好累啊,后来室友说要更新update5,点了更新之后就是无情 ...
- 老李的blog使用日记(2)
寥寥数语结束一个不曾期待的遇见,可还是剧情不会这样结束,他也会在我的时间里注册自己的专属账号,无论什么时候,他会时而需要被注视着,为了达到目的,即使不择手段,只为一次擦肩而过的邂逅,极短的一段时间,相 ...
- SMS
SMS:(Short Messaging Service)手机短信服务 . 一种存储和转发服务,短消息并不是直接从发送人发送到接收人,而始终通过 SMS 中心进行转发的.如果接收人处于未连接状态(可能 ...
- [转帖] sparkdev 的 博客 systemd
从 init 系统说起 https://www.cnblogs.com/sparkdev/p/8448237.html systemd的内容 需要学习下. linux 操作系统的启动首先从 BIOS ...
- java自定义注解学习(一)_demo小练习
自定义注解 现在大家开发过程中,经常会用到注解. 比如@Controller 等等,但是有时候也会碰到自定义注解,在开发中公司的记录日志就用到了自定义注解.身为渣渣猿还是有必要学习下自定义注解的. 这 ...
- Delphi : 制作程序启动欢迎界面
制作欢迎界面的代码,大家参考 登陆窗体命名為:loginform.找到工程文件(Project -> View Source),找到如下代碼部分:begin Application.Init ...
- js new关键字
实现new 关键字只需4步 1. 声明一个对象: 2. 把这个对象的__proto__ 指向构造函数的 prototype; 3. 以构造函数为上下文执行这个对象: 4. 返回这个对象. 简洁的代码示 ...
- JDK8新特性,方法的引用
引用方法并运行 在Java中,方法和构造方法都看作是对象的一种,那么你要引用它(不是调用),则可以用::来引用.用来存储这个引用的类型用@FunctionlaInterface注解来标识. 示例: p ...
- Oil Skimming HDU - 4185(匹配板题)
Oil Skimming Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...