Description

给一张 \(n\) 个点的无向完全图,同时还有 \(m\) 种颜色。要求给每条边染色,问有多少种不同的染色方案。两种方案不同当且仅当顶点标号任意重排后不同。\(n\leq 53\)。

Solution

好吧上课讲的题我还研究了一整个二晚的题解 上课睡觉就是不应该

首先这题要求边的不同染色方案,如果要用 \(burnside\) 或者 \(polya\) 那一套的话需要求边的置换,但是判断方案是否相同又是点的置换。好吧我们考虑点的置换看看在中间能不能统计出来边的置换的方案数。

把一个点置换搞出来,它含有若干轮换 \((a_1,a_2\dots)(b_1,b_2\dots)\dots\)

考虑这若干轮换中的边置换产生的轨道数。分以下两种情况考虑:

  1. 考虑两个端点分别在两个轮换 \(a,b\) 中的边。设 \(a,b\) 的长度分别是 \(l_1,l_2\),那么总点数就是 \(l_1\cdot l_2\) 个,循环节是 \(\operatorname{lcm}(l_1,l_2)\),所以一共有 \(\gcd(l_1,l_2)\) 个轨道。
  2. 对于两个端点在一个轮换 \(a\) 中的边,要分轮换的长度奇偶性来考虑。
    • 如果 \(l_1\) 是奇数,那么循环节是 \(l_1\),一共有 \(C(l_1,2)\) 个点对,所以一共有 \(\frac{l_1-1}2\) 个轨道。
    • 如果 \(l_1\) 是偶数,那么循环节是 \(l_1\) 或者 \(\frac{l_1}2\),因为两点的距离恰好是 \(\frac{l_1}2\) 的时候循环节只能是 \(\frac{l_1}2\) 就重复了。所以一共有 \(\frac{C(l_1,2)-\frac{l_1}2}{l_1}+1=\frac{l_1}2\) 个轨道。

最后要求的就是对于当前已经分好组的轮换组,有多少个置换满足这个条件。

emmm这个就相当于把 \(n\) 个人分配到 \(k\) 个长度给定的独立的圆排列里,然后经过一番神仙推导得出总分配数为 \(\frac{n!}{\prod\limits_{i=1}^k l_i\prod\limits_{i=1}^n B_i!}\)。其中 \(B_i\) 为 \(l_x=i\) 的 \(x\) 的个数。

最后记得除以 \(n!\)。

Code

#include<bits/stdc++.h>
using std::min;
using std::max;
using std::swap;
using std::vector;
typedef double db;
typedef long long ll;
#define pb(A) push_back(A)
#define pii std::pair<int,int>
#define all(A) A.begin(),A.end()
#define mp(A,B) std::make_pair(A,B)
const int N=60;
#define inv(x) ksm(x,mod-2) int a[N],b[N];
int l[N],fac[N];
int n,m,mod,cnt,ans; int gcd(int a,int b){
return b?gcd(b,a%b):a;
} int ksm(int a,int b,int ans=1){
while(b){
if(b&1) ans=1ll*ans*a%mod;
a=1ll*a*a%mod;b>>=1;
} return ans;
} int getint(){
int X=0,w=0;char ch=getchar();
while(!isdigit(ch))w|=ch=='-',ch=getchar();
while( isdigit(ch))X=X*10+ch-48,ch=getchar();
if(w) return -X;return X;
} void solve(int n){
memset(b,0,sizeof b);
for(int i=1;i<=n;i++) b[l[i]]++;
ll now=0;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
(now+=gcd(l[i],l[j]))%=mod;
for(int i=1;i<=n;i++)
(now+=l[i]/2)%=mod;
ll noww=1;
for(int i=1;i<=n;i++)
(noww*=l[i])%=mod;
for(int i=1;i<=::n;i++)
(noww*=fac[b[i]])%=mod;
ans=(1ll*ksm(noww,mod-2)*fac[::n]%mod*ksm(m,now)%mod+ans)%mod;
} void dfs(int now,int res,int las){
if(!res){solve(now-1);return;}
for(int i=las;i<=res;i++){
l[now]=i;
dfs(now+1,res-i,i);
}
} signed main(){
n=getint(),m=getint(),mod=getint();
fac[0]=1;
for(int i=1;i<=53;i++) fac[i]=1ll*fac[i-1]*i%mod;
dfs(1,n,1);
printf("%lld\n",1ll*ans*inv(fac[n])%mod);
return 0;
}

[SHOI2006] 有色图的更多相关文章

  1. 洛谷 P4128 [SHOI2006]有色图 解题报告

    P4128 [SHOI2006]有色图 题目描述 如果一张无向完全图(完全图就是任意两个不同的顶点之间有且仅有一条边相连)的每条边都被染成了一种颜色,我们就称这种图为有色图.如果两张有色图有相同数量的 ...

  2. 洛谷 P4128: bzoj 1815: [SHOI2006]有色图

    题目传送门:洛谷 P4128. 计数好题,原来是 13 年前就出现了经典套路啊.这题在当年应该很难吧. 题意简述: \(n\) 个点的完全图,点没有颜色,边有 \(m\) 种颜色,问本质不同的图的数量 ...

  3. BZOJ1815 SHOI2006有色图(Polya定理)

    置换数量是阶乘级别的,但容易发现本质不同的点的置换数量仅仅是n的整数拆分个数,OEIS(或者写个dp或者暴力)一下会发现不是很大,当n=53时约在3e5左右. 于是暴力枚举点的置换,并且发现根据点的置 ...

  4. P4128 [SHOI2006]有色图

    传送门 数学渣渣看题解看得想死Ծ‸Ծ 首先发现这玩意儿看着很像polya定理 \[L=\frac{1}{|G|}\sum_{i\in G}m^{w(i)}\] 然而polya定理只能用来求点的置换,边 ...

  5. bzoj 1815: [Shoi2006]color 有色图 置换群

    1815: [Shoi2006]color 有色图 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 136  Solved: 50[Submit][Stat ...

  6. BZOJ1815: [Shoi2006]color 有色图

    BZOJ1815: [Shoi2006]color 有色图 Description Input 输入三个整数N,M,P 1< = N <= 53 1< = M < = 1000 ...

  7. BZOJ 1815: [Shoi2006]color 有色图(Polya定理)

    题意 如果一张无向完全图(完全图就是任意两个不同的顶点之间有且仅有一条边相连)的每条边都被染成了一种颜色,我们就称这种图为有色图. 如果两张有色图有相同数量的顶点,而且经过某种顶点编号的重排,能够使得 ...

  8. BZOJ 1815: [Shoi2006]color 有色图 [Polya DFS 重复合并]

    传送门 题意: 染色图是无向完全图,且每条边可被染成k种颜色中的一种.两个染色图是同构的,当且仅当可以改变一个图的顶点的编号,使得两个染色图完全相同.问N个顶点,k种颜色,本质不同的染色图个数(模质数 ...

  9. [SHOI2006]color 有色图[群论、组合计数]

    题意 用 \(m\) 种颜色,给 \(n\) 个点的无向完全图的 \(\frac{n(n-1)}{2}\) 条边染色,两种方案相同当且仅当一种方案交换一些点的编号后可以变成另一种方案.问有多少本质不同 ...

随机推荐

  1. ahk保存

    python ;把大写禁用了,因为确实基本不用.`表示删除,caplock+ijkl可以控制光标 SetCapsLockState , AlwaysOff ;用;p来替换书写经常不好使,因为输入多个字 ...

  2. ABP框架系列之十五:(Caching-缓存)

    Introduction ASP.NET Boilerplate provides an abstraction for caching. It internally uses this cache ...

  3. w9 Ansible批量管理与维护

    Ansible是2013年推出的一种通用自动化工具,可用于配置管理或工作流程自动化.配置管理是一种“基础架构代码”实践,它将事物编码,例如应该在系统上安装什么包和版本,或者应该运行什么守护进程.工作流 ...

  4. Vuejs——(1)入门(单向绑定、双向绑定、列表渲染、响应函数)

    版权声明:出处http://blog.csdn.net/qq20004604   目录(?)[+]   参照链接: http://cn.vuejs.org/guide/index.html [起步]部 ...

  5. bash编程-Shell变量

    bash中,所有变量的值默认均为字符串. 1. 变量操作 调用变量 $变量 查看变量(所有类型) set 删除变量 unset 变量 2. 变量分类 2.1 自定义变量 自定义变量仅对当前Shell有 ...

  6. ASP.NET Core OceLot 微服务实践

    1.OceLot中间件介绍 在传统的BS应用中,随着业务需求的快速发展变化,需求不断增长,迫切需要一种更加快速高效的软件交付方式.微服务可以弥补单体应用不足,是一种更加快速高效软件架构风格.单体应用被 ...

  7. Mybatis关系映射

    一.一对一关系映射 使用resultType+包装类实现 1.假设问题背景是要求在某一个购物平台的后台程序中添加一个这样的功能:查询某个订单的信息和下该订单的用户信息.首先我们可以知道,一般这样的平台 ...

  8. 《http权威指南》读书笔记2

    概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...

  9. 利用SSH反向隧道,连接内网服务器

    前言 公司有一台文件服务器(内部使用,无外网IP),上面主要安装了SVN服务,用来存储和共享各部门的文档,因为都是内网,直接远程(mstsc)上去就可以方便维护,但最近公司租了新的办公室,部分员工被分 ...

  10. Python: Ubuntu 安装numpy,scipy,matplotlib

    安装python-dev 安装这个包,以后安装各种python扩展包,可以省很多事情. sudo apt-get install python-dev 使用apt-get 安装 只需要下面的几个命令即 ...