题意:一个无向图,用$k$种不同的颜色给每条边染色,问能染出多少种不同的图,如果两张图能通过循环移位环边使得颜色相同,那么这两张图被认为是相同的

数学太差伤不起啊...补了一下Burnside定理的证明,这里写一些类似笔记的东西...

置换$\left(\begin{matrix}1\cdots n\\i_1\cdots i_n\end{matrix}\right)$有合成运算$\circ$,满足结合律,有单位元$\iota$,存在唯一逆元满足$f\circ f^{-1}=\iota$,所有$n!$个置换构成集合$S_n$

如果$G\subseteq S_n$且满足以下三条性质,定义它为置换群

1.$\forall f,g\in G,f\circ g\in G$

2.$\iota\in G$

3.$\forall f\in G,f^{-1}\in G$

每一个置换群都满足消去律$f\circ g=f\circ h\Rightarrow g=h$

$\rho_n=\left(\begin{matrix}1&\cdots&n-1&n\\2&\cdots&n&1\end{matrix}\right)$,易证$C_n=\{\rho_n^i|1\leq i\leq n\}$是一个置换群

着色$\mathbf c$:$i$的颜色为$c(i)$,着色集合$\mathcal C$

定义$f*\mathbf c$为使$i_k$的颜色为$c(k)$的着色(就是把颜色沿着置换移动)

$\forall f\in G,\mathbf c\in\mathcal C,f*\mathbf c\in\mathcal C$

$(g\circ f)*\mathbf c=g*(f*\mathbf c)$

若$\mathbf c_1,\mathbf c_2\in\mathcal C$,$\exists f\in G$使$f*\mathbf c_1=\mathbf c_2$,称$\mathbf c_1$等价于$\mathbf c_2$,记作$\mathbf c_1\sim\mathbf c_2$,这是$\mathcal C$上的等价关系

$\mathbf c$的稳定核$G(\mathbf c)=\{f|f\in G,f*\mathbf c=\mathbf c\}$是置换群

$\mathcal C(f)=\{\mathbf c|\mathbf c\in\mathcal C,f*\mathbf c=\mathbf c\}$

快要证Burnside定理了,先做一些准备工作

1.$\forall f,g\in G,f*\mathbf c=g*\mathbf c\Leftrightarrow f^{-1}\circ g\in G(\mathbf c)$

正:$(f^{-1}\circ g)*\mathbf c=f^{-1}*(g*\mathbf c)=f^{-1}*(f*\mathbf c)=\mathbf c\Rightarrow f^{-1}\circ g\in G(\mathbf c)$

反:$\mathbf c=(f^{-1}\circ g)*\mathbf c=f^{-1}*(g*\mathbf c)\Rightarrow f*\mathbf c=g*\mathbf c$

2.与$\mathbf c$等价的着色数$\left|\{f*\mathbf c|f\in G\}\right|=\dfrac{|G|}{|G(\mathbf c)|}$

由1得$f*\mathbf c=g*\mathbf c\Rightarrow g\in\{{f\circ h}|h\in G(\mathbf c)\}$,由消去律得$f\circ h=f\circ h'\Rightarrow h=h'$,所以对每个$f$恰有$|G(\mathbf c)|$个满足要求的$g$,得证

现在来证Burnside定理:非等价着色数$N(G,\mathcal C)=\dfrac1{|G|}\sum\limits_{f\in G}|\mathcal C(f)|$

先用两种方式计数满足$f*\mathbf c=\mathbf c$的$(f,\mathbf c)$的对数

$\sum\limits_{f\in G}|\mathcal C(f)|=\sum\limits_{\mathbf c\in\mathcal C}|G(\mathbf c)|$

由2得$\sum\limits_{\mathbf c\in\mathcal C}|G(\mathbf c)|=|G|\sum\limits_{\mathbf c\in\mathcal C}\dfrac1{(与\mathbf c等价的着色数)}$

右边的sigma中,每个等价类都贡献$1$,所以它等于$N(G,\mathcal C)$,定理得证

在此题中,如果一个点双只含一个环,就要用Burnside定理计数方案

设它有$n$条边,这题的循环移位对应置换群$C_n$

$|\mathcal C(\rho_n^i)|=k^{(n,i)}$,这是因为如果$\rho_n^i*\mathbf c=\mathbf c$那么$c(p)=c(p+i)$,这个限制把$n$条边分成了互相独立的$(n,i)$组,每组必须同色

所以方案数是$\dfrac1n\sum\limits_{i=1}^nk^{(i,n)}$

如果一个点双含多个环,那么我们有办法交换任意两边

题解上的这张图告诉我们,一个度数$\geq3$的点的两条出边可以被交换(图中的绿和蓝)

然后我们可以交换任意相邻边,先把它们转到度数$\geq3$的点,做如上变换,再转回去即可

然后我们可以交换任意两边,用至多两次操作我们可以使它们相邻,交换后倒着操作回去即可

所以这样的点双方案数只与颜色数有关,$n$条边的点双答案为$\binom{n+k-1}{k-1}$

不属于任何点双的边对答案的贡献就是$k$了

#include<stdio.h>
#include<vector>
#include<set>
using namespace std;
typedef long long ll;
const int mod=1000000007;
int mul(int a,int b){return a*(ll)b%mod;}
void inc(int&a,int b){(a+=b)%=mod;}
int pow(int a,int b){
	int s=1;
	while(b){
		if(b&1)s=mul(s,a);
		a=mul(a,a);
		b>>=1;
	}
	return s;
}
vector<int>g[60];
int fac[210],rfac[210],k;
int C(int n,int k){return mul(fac[n],mul(rfac[k],rfac[n-k]));}
int dfn[60],low[60],stk[60],tp,M,ans;
set<int>s;
int gcd(int a,int b){return a%b==0?b:gcd(b,a%b);}
int burnside(int n){
	int i,s=0;
	for(i=1;i<=n;i++)inc(s,pow(k,gcd(i,n)));
	return mul(s,pow(n,mod-2));
}
void dfs(int x){
	int t,n,m;
	dfn[x]=low[x]=++M;
	stk[++tp]=x;
	for(int y:g[x]){
		if(!dfn[y]){
			dfs(y);
			low[x]=min(low[x],low[y]);
			if(low[y]>=dfn[x]){
				s.clear();
				do{
					t=stk[tp--];
					s.insert(t);
				}while(t!=y);
				s.insert(x);
				n=s.size();
				m=0;
				for(int x:s){
					for(int y:g[x]){
						if(s.count(y))m++;
					}
				}
				m>>=1;
				if(m<n)ans=mul(ans,k);
				if(n==m)ans=mul(ans,burnside(m));
				if(n<m)ans=mul(ans,C(m+k-1,k-1));
			}
		}else
			low[x]=min(low[x],dfn[y]);
	}
}
int main(){
	int n,m,i,x,y;
	scanf("%d%d%d",&n,&m,&k);
	for(i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		g[x].push_back(y);
		g[y].push_back(x);
	}
	fac[0]=1;
	for(i=1;i<=m+k;i++)fac[i]=mul(fac[i-1],i);
	rfac[m+k]=pow(fac[m+k],mod-2);
	for(i=m+k;i>0;i--)rfac[i-1]=mul(rfac[i],i);
	ans=1;
	for(i=1;i<=n;i++){
		if(!dfn[i])dfs(i);
	}
	printf("%d",ans);
}

[ARC062F]Painting Graphs with AtCoDeer的更多相关文章

  1. [Arc062] Painting Graphs with AtCoDeer

    [Arc062] Painting Graphs with AtCoDeer Description 给定一张N点M边的无向图,每条边要染一个编号在1到K的颜色.你可以对一张染色了的图进行若干次操作, ...

  2. ARC 062 F - Painting Graphs with AtCoDeer 割点 割边 不动点 burnside引理

    LINK:Painting Graphs with AtCoDeer 看英文题面果然有点吃不消 一些细节会被忽略掉. 问每条边都要被染色 且一个环上边的颜色可以旋转. 用c种颜色有多少本质不同的方法. ...

  3. 【AtCoder】ARC062F - AtCoDeerくんとグラフ色塗り / Painting Graphs with AtCoDeer

    题解 考虑一个点双(因为是简单环),如果没有环(两点一线),那么乘上K 如果有一个环,那么用polya定理,每个置换圈有gcd(i,n)个循环节 如果有两个及以上的环,任何一种置换都合法,那么只和每个 ...

  4. 【ARC062F】 Painting Graphs with AtCoDeer 点双连通分量+polya定理

    Description 给定一张N点M边的无向图,每条边要染一个编号在1到K的颜色. 你可以对一张染色了的图进行若干次操作,每次操作形如,在图中选择一个简单环(即不经过相同点的环),并且将其颜色逆时针 ...

  5. ARC062F AtCoDeerくんとグラフ色塗り / Painting Graphs with AtCoDeer Burnside 引理

    题目传送门 https://atcoder.jp/contests/arc062/tasks/arc062_d 题解 首先对整张图做 Tarjan 点双. 对于一个点双,如果是由一条边构成的,那么很显 ...

  6. AtcoderARC062F Painting Graphs with AtCoDeer 【双连通分量】【polya原理】

    题目分析: 如果一个双连通分量是简单环,那么用polya原理计数循环移位即可. 如果一个双连通分量不是简单环,那么它必然可以两两互换,不信你可以证明一下相邻的可以互换. 如果一条边是桥,那么直接乘以k ...

  7. ARC062 - F. Painting Graphs with AtCoDeer (Polya+点双联通分量)

    似乎好久都没写博客了....赶快来补一篇 题意 给你一个 \(n\) 个点 , 没有重边和自环的图 . 有 \(m\) 条边 , 每条边可以染 \(1 \to k\) 中的一种颜色 . 对于任意一个简 ...

  8. 2018.09.20 atcoder Painting Graphs with AtCoDeer(tarjan+polya)

    传送门 一道思维题. 如果没有环那么对答案有k的贡献. 如果恰为一个环,可以用polya求贡献. 如果是一个有多个环重叠的双联通的话,直接转化为组合数问题(可以证明只要每种颜色被选取的次数相同一定可以 ...

  9. [atARC062F]Painting Graphs with AtCoDeer

    求出点双后缩点,对于点双之间,显然不存在简单环,即每一个简单环一定在一个点双内部,换言之即每一个点双可以独立的考虑,然后将结果相乘 (对于点双之间的边任意染色,即若有$s$条边,还会有$k^{s}$的 ...

随机推荐

  1. Spring4+SpringMVC+MyBatis整合思路(山东数漫江湖)

    1.Spring框架的搭建 这个很简单,只需要web容器中注册org.springframework.web.context.ContextLoaderListener,并指定spring加载配置文件 ...

  2. 【洛谷 P2783】 有机化学之神偶尔会做作弊 (双联通分量)

    题目链接 可能是除了<概率论>的最水的黑题了吧 用\(Tarjan\)缩点(点双联通分量),然后就是树上两点之间的距离了,跑\(LCA\)就好了. #include <cstdio& ...

  3. 聂老师的考验(反向bfs)

    题目链接:http://113.240.233.2:8081/JudgeOnline/problem.php?id=1121 这个题看起来要多次使用bfs,其实只要换个思维就会发现这就是一个简单的bf ...

  4. 深入理解javascript原型和闭包(2)——函数与对象的关系

    上文(理解javascript原型和作用域系列(1)——一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; co ...

  5. I题 hdu 1234 开门人和关门人

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1234 开门人和关门人 Time Limit: 2000/1000 MS (Java/Others)   ...

  6. Spring Boot:定制自己的starter

    在学习Spring Boot的过程中,接触最多的就是starter.可以认为starter是一种服务——使得使用某个功能的开发者不需要关注各种依赖库的处理,不需要具体的配置信息,由Spring Boo ...

  7. C json实战引擎 一 , 实现解析部分

    引言 以前可能是去年的去年,写了一个 c json 解析引擎用于一个统计实验数据项目开发中. 基本上能用. 去年在网上 看见了好多开源的c json引擎 .对其中一个比较标准的 cJSON 引擎 深入 ...

  8. openstack前期准备

    . 两台虚拟机,安装Centos7系统 两个网卡 -- 一个NAT模式,一个仅主机模式 两个硬盘 -- 一个20GB,一个50GB 内存 -- 主 .6GB(根据自己的配置,大于2G即可) 从 1.6 ...

  9. docker基于本地模版导入创建镜像

    /* 因为直接去网站拿会下载的慢,所以直接到网站里,对着此包--〉右键--〉复制链接地址 网站地址:https://openvz.org/Download/template/precreated */ ...

  10. Oracle简述

    Oracle是甲骨文公司推出的一款大型数据库管理系统.甲骨文公司成立于1977年,总部位于美国加利福尼亚州的红木滩.1989年,Oracle正式进入中国市场:2013年,甲骨文超越 IBM ,成为继 ...