题意:一个无向图,用$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));}}elselow[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);
}

转载于:https://www.cnblogs.com/jefflyy/p/9470630.html

[ARC062F]Painting Graphs with AtCoDeer相关推荐

  1. Atcoder ARC062F - AtCoDeerくんとグラフ色塗り / Painting Graphs with AtCoDeer

    Atcoder ARC062F - AtCoDeerくんとグラフ色塗り / Painting Graphs with AtCoDeer 题目描述 简要题意:给定一个有标号的无向图,你可以给每条边染上K ...

  2. atcoder题目合集(持续更新中)

    Choosing Points 数学 Integers on a Tree 构造 Leftmost Ball 计数dp+组合数学 Painting Graphs with AtCoDeer tarja ...

  3. stcoder Splatter Painting 记忆化搜索

    5647: Splatter Painting 时间限制: 2 Sec  内存限制: 256 MB 提交: 32  解决: 16 [提交] [状态] [讨论版] [命题人:admin] 题目描述 Sq ...

  4. AtCoder2362 - Splatter Painting - DFS+思维

    1.题目描述: B - Splatter Painting Time limit : 2sec / Memory limit : 256MB Score : 700 points Problem St ...

  5. [bzoj1582][Usaco2009 Hol]Holiday Painting 节日画画_线段树

    Holiday Painting 节日画画 bzoj-1582 Usaco-2009 Hol 题目大意:给定两个n*m的01网格图.q次操作,每次将第二个网格图的子矩阵全部变成0或1,问每一次操作后两 ...

  6. 概念艺术绘画学习教程 Schoolism – Foolproof Concept Painting with Airi Pan

    Schoolism--万无一失的概念绘画潘 大小解压后:3.19G 含课程素材文件 1920X1080 .mp4 语言:英语+中英文字幕(根据原英文字幕机译更准确) 信息: 万无一失的概念绘画潘 本课 ...

  7. 火焰图(Flame Graphs)的安装和基本用法

    火焰图(Flame Graphs) 一.概述: 火焰图(flame graph)是性能分析的利器,通过它可以快速定位性能瓶颈点. perf 命令(performance 的缩写)是 Linux 系统原 ...

  8. Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...

  9. AT2362 [AGC012B] Splatter Painting(思维、dfs染色、剪枝)

    AT2362 [AGC012B] Splatter Painting 题意 给一个n个点m条边的无向图,有q次操作 第i次操作,给出v,d,c,把所有到点v的距离不超过d的点都染上颜色c 问最后每个点 ...

最新文章

  1. java 80端口_Java80端口占用异常解决方法
  2. 程序员级别鉴定书(.NET面试问答集锦)
  3. Linux下常用日志分析工具
  4. Ribbon 客户端负载均衡
  5. eclipse复制代码连接数据库404_推荐一款免费的数据库管理工具,比Navicat还要好用,功能还很强大...
  6. 这家中国企业和星巴克对着干 年亏16亿却成为全球最快上市公司
  7. html5 心,HTML5你必须知道的28个新特性
  8. 如何使用小程序自定义组件功能
  9. servlet向ajax传递数据库,一、JSP、servlet、SQL三者之间的数据传递(前台与后台数据交互)...
  10. web开发兼容性测试工具
  11. 哥写的不是代码,是寂寞
  12. 布谷鸟算法的程序(个人注释)
  13. 使用iptables+脚本实现只允许中国IP访问服务器
  14. 移动统计工具Flurry
  15. Hive3.1.2 on spark
  16. 21考研上岸吉大人工智能学院考研复习策略
  17. 关于idea新建子目录时往父目录名字后叠加而不是树形结构的解决方法
  18. WPS JS宏表格定位实例
  19. norflash的基本操作2
  20. mysql数据库之存储过程

热门文章

  1. STL Priority_Queue
  2. Horseshoe prior的R package介绍:HS.normal.mean函数
  3. UA MATH564 概率论 依概率收敛的题目
  4. ACM基础题 - 去除字符序列中的几个字符
  5. ReactOS 架构
  6. 搜狗拼音输入法新加词库的基本使用
  7. matlab数字图像处理初级入门
  8. 一点点学习PS--实战七
  9. table 隔列换色
  10. [2019BUAA软件工程]第1次阅读作业