BZOJ 1815: [Shoi2006]color 有色图 [Polya DFS 重复合并]
题意:
染色图是无向完全图,且每条边可被染成k种颜色中的一种。
两个染色图是同构的,当且仅当可以改变一个图的顶点的编号,使得两个染色图完全相同。
问N个顶点,k种颜色,本质不同的染色图个数(模质数N≤53,P<109)。
想了一节课和一中午又看了课件
相同类型的循环合并的想法很巧妙
首先,点的置换对应唯一边的置换,我们可以枚举所有点的置换,找出每个置换下边置换的循环有多少个,然后套$Polya$公式
但是复杂度带叹号
我们发现,很多点置换类型是一样的,我们可以对$n$搜索划分来枚举点置换的类型(即每个循环的长度),然后找出这种类型的置换有多少个
设每个循环长度$L_1,L_2,...,L_n$,那么相同类型的置换就相当于每个循环做圆排列,然后消除循环长度相同的影响
$\frac{n!}{L_1 L_2...L_n s_1! s_2!...s_t!}$
$s$为相同的长度的个数
那么如何从点的置换得到边的置换?
同一个循环里的边,他们的循环个数为$\frac{L}{2}$,具体可以把点排成一个圈画图观察一下
两个循环之间的边,他们的循环长度为$LCM(L_1,L_2)$,共有$L_1*L_2$条边,则个数为$GCD(L_1,L_2)$
然后就可以做了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=;
typedef long long ll;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,m,P;
ll inv[N],fac[N],facInv[N];
void ini(){
inv[]=;fac[]=facInv[]=;
for(int i=;i<=n;i++){
if(i!=) inv[i]=-P/i*inv[P%i]%P;
if(inv[i]<) inv[i]+=P;
fac[i]=fac[i-]*i%P;
facInv[i]=facInv[i-]*inv[i]%P;
}
}
int L[N],tot;
ll sum,ans;
inline int gcd(int a,int b){return b== ? a : gcd(b,a%b);}
inline ll Pow(ll a,int b){
ll re=;
for(;b;b>>=,a=a*a%P)
if(b&) re=re*a%P;
return re;
}
inline void mod(ll &x){if(x>=P) x-=P;}
void dfs(int d,int now){
if(d==n){
int lo=;
ll cnt=fac[n],same=;
sort(L+,L++tot);
//printf("tot %d\n",tot);
//for(int i=1;i<=tot;i++) printf("%d ",L[i]);puts("\n end");
for(int i=;i<=tot;i++){
lo+=L[i]/;
for(int j=i+;j<=tot;j++) lo+=gcd(L[i],L[j]); cnt=cnt*inv[L[i]]%P;
if(i!=&&L[i]==L[i-]) same++;
else if(same!=) cnt=cnt*facInv[same]%P,same=;
}
if(same!=) cnt=cnt*facInv[same]%P;
//printf("hi %d %lld\n",lo,cnt);
mod(sum+=cnt);
mod(ans+=cnt%P*Pow(m,lo)%P);
//puts("\n");
}else{
for(int j=now;d+j<=n;j++){
L[++tot]=j;
dfs(d+j,j);
tot--;
}
}
}
int main(){
freopen("in","r",stdin);
n=read();m=read();P=read();
ini();
dfs(,);
//printf("%lld %lld\n",ans,sum);
ans=ans*Pow(sum,P-)%P;
printf("%lld",ans);
}
BZOJ 1815: [Shoi2006]color 有色图 [Polya DFS 重复合并]的更多相关文章
- bzoj 1815: [Shoi2006]color 有色图 置换群
1815: [Shoi2006]color 有色图 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 136 Solved: 50[Submit][Stat ...
- bzoj 1478: Sgu282 Isomorphism && 1815: [Shoi2006]color 有色图【dfs+polya定理】
参考 https://wenku.baidu.com/view/fee9e9b9bceb19e8b8f6ba7a.html?from=search### 的最后一道例题 首先无向完全图是个若干点的置换 ...
- BZOJ 1815: [Shoi2006]color 有色图(Polya定理)
题意 如果一张无向完全图(完全图就是任意两个不同的顶点之间有且仅有一条边相连)的每条边都被染成了一种颜色,我们就称这种图为有色图. 如果两张有色图有相同数量的顶点,而且经过某种顶点编号的重排,能够使得 ...
- BZOJ1815: [Shoi2006]color 有色图
BZOJ1815: [Shoi2006]color 有色图 Description Input 输入三个整数N,M,P 1< = N <= 53 1< = M < = 1000 ...
- 洛谷 P4128: bzoj 1815: [SHOI2006]有色图
题目传送门:洛谷 P4128. 计数好题,原来是 13 年前就出现了经典套路啊.这题在当年应该很难吧. 题意简述: \(n\) 个点的完全图,点没有颜色,边有 \(m\) 种颜色,问本质不同的图的数量 ...
- [SHOI2006]color 有色图[群论、组合计数]
题意 用 \(m\) 种颜色,给 \(n\) 个点的无向完全图的 \(\frac{n(n-1)}{2}\) 条边染色,两种方案相同当且仅当一种方案交换一些点的编号后可以变成另一种方案.问有多少本质不同 ...
- 【BZOJ 1815】【SHOI 2006】color 有色图
http://www.lydsy.com/JudgeOnline/problem.php?id=1815 这道题好难啊,组合数学什么根本不会啊qwq 题解详见08年的Pólya计数论文. 主要思想是只 ...
- bzoj 1488: [HNOI2009]图的同构【polya定理+dfs】
把连边和不连边看成黑白染色,然后就变成了 https://www.cnblogs.com/lokiii/p/10055629.html 这篇讲得好!https://blog.csdn.net/wzq_ ...
- [BZOJ 1082] [SCOI2005] 栅栏 【二分 + DFS验证(有效剪枝)】
题目链接:BZOJ - 1082 题目分析 二分 + DFS验证. 二分到一个 mid ,验证能否选 mid 个根木棍,显然要选最小的 mid 根. 使用 DFS 验证,因为贪心地想一下,要尽量先用提 ...
随机推荐
- koala 编译scss不支持中文(包括中文注释),解决方案如下
进入Koala安装目录,例如:C:\Program Files (x86)\Koala\rubygems\gems\sass-3.4.9\lib\sass 找到engine.rb文件,在该文件中找到最 ...
- POJ 1797 Heavy Transportation(Dijkstra变形——最长路径最小权值)
题目链接: http://poj.org/problem?id=1797 Background Hugo Heavy is happy. After the breakdown of the Carg ...
- 从零开始学习前端开发 — 7、CSS宽高自适应
一.宽度自适应 语法:width:100%; 注: a)块状元素的默认宽度为100% b) 当给元素设置宽度为100%时,继承父元素的宽度 c) 通常使用宽度自适应实现通栏效果 二.高度自适应 语法: ...
- Java面试经
最近趁有空整理下面试经常会被问到的知识点,参考的资料都是本人通过百度而挑选出来的,具有一定的参考意义. 一 .java基础1.String和StringBuffer.StringBuild的区别:ht ...
- Struts的session问题
问题描述: 在一个action中设置session之后,在jsp中得不到session的值或者在另一个action中得不到session的值. 解决方案: 1.不要把session设置成为静态的,同时 ...
- 数据结构 链式哈希表(Hash Table)的接口定义与实现分析(完整代码)
链式哈希表的接口定义 关于哈希表与链式哈希表的描述可以参阅:http://www.cnblogs.com/idreamo/p/7990860.html 链式哈希表的操作与属性有:初始化.销毁.插入元素 ...
- list类型
list是一个链表结构,可以模拟栈,队列 lpush list中压入一个元素 模拟栈 lrange 取出list的中的元素(0 -1 表示从头取到尾) rpush list中压入一个元素 模 ...
- apktool给软件加注册机修改图标和文件名
功能实现,即让你的软件具有注册机功能,或者破解别人的软件,据为己有! 先反编译文件包 然后全局工具,修改图标和名称 加注册机,输入key,下载计算器,即可.给某个用户设置自定义的使用时间!
- JS动态获取当前时间
HTML部分: <div class="div"> <div id="div"> </div> </div> C ...
- XML,HTML,XHTML
对于上面3种技术,我们经常使用到,这里具体的做一个总结,来对比一下这3个东西. 什么是XML? XML即Extentsible Markup Language(可扩展标记语言),是用来定义其它语言的一 ...