传送门

题意:

染色图是无向完全图,且每条边可被染成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=60;
typedef long long ll;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}return x*f;
}
int n,m,P;
ll inv[N],fac[N],facInv[N];
void ini(){inv[1]=1;fac[0]=facInv[0]=1;for(int i=1;i<=n;i++){if(i!=1) inv[i]=-P/i*inv[P%i]%P;if(inv[i]<0) inv[i]+=P;fac[i]=fac[i-1]*i%P;facInv[i]=facInv[i-1]*inv[i]%P;}
}
int L[N],tot;
ll sum,ans;
inline int gcd(int a,int b){return b==0 ? a : gcd(b,a%b);}
inline ll Pow(ll a,int b){ll re=1;for(;b;b>>=1,a=a*a%P)if(b&1) 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=0;ll cnt=fac[n],same=1;sort(L+1,L+1+tot);//printf("tot %d\n",tot);//for(int i=1;i<=tot;i++) printf("%d ",L[i]);puts("\n end");for(int i=1;i<=tot;i++){lo+=L[i]/2;for(int j=i+1;j<=tot;j++) lo+=gcd(L[i],L[j]);cnt=cnt*inv[L[i]]%P;if(i!=1&&L[i]==L[i-1]) same++;else if(same!=1) cnt=cnt*facInv[same]%P,same=1;}if(same!=1) 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(0,1);//printf("%lld %lld\n",ans,sum);ans=ans*Pow(sum,P-2)%P;printf("%lld",ans);
}

BZOJ 1815: [Shoi2006]color 有色图 [Polya DFS 重复合并]相关推荐

  1. bzoj 1016: [JSOI2008]最小生成树计数【dfs+克鲁斯卡尔】

    有一个性质就是组成最小生成树总边权值的若干边权总是相等的 这意味着按边权排序后在权值相同的一段区间内的边能被选入最小生成树的条数是固定的 所以先随便求一个最小生成树,把每段的入选边数记录下来 然后对于 ...

  2. BZOJ 3083: 遥远的国度(树链剖分+DFS序)

    可以很显而易见的看出,修改就是树链剖分,而询问就是在dfs出的线段树里查询最小值,但由于这道题会修改根节点,所以在查询的时候需判断x是否为root的祖先,如果不是就直接做,是的话应该查询从1-st[y ...

  3. BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )

    不同最小生成树中权值相同的边数量是一定的, 而且他们对连通性的贡献是一样的.对权值相同的边放在一起(至多10), 暴搜他们有多少种方案, 然后乘法原理. ----------------------- ...

  4. bzoj 2435: [Noi2011]道路修建(DFS)

    2435: [Noi2011]道路修建 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 4110  Solved: 1429 [Submit][Sta ...

  5. bzoj 1086: [SCOI2005]王室联邦(DFS)

    1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge Submit: 2100  Solved ...

  6. bzoj 1082: [SCOI2005]栅栏(二分+DFS)

    1082: [SCOI2005]栅栏 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2373  Solved: 1007 [Submit][Stat ...

  7. bzoj 1064: [Noi2008]假面舞会(DFS)

    1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2240  Solved: 1083 [Submit][Sta ...

  8. BZOJ 4719: [Noip2016]天天爱跑步 线段树合并

    title BZOJ 4719 LUOGU 1600 简化题意: 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每 ...

  9. php 数组不重复合并,php合并数组并去除重复

    php合并数组并去除重复 php合并数组并去除重复的实现方法:1.使用"array_merge"方法或者"+"符号实现合并数组:2.通过"array_ ...

最新文章

  1. IE8下面的line-height的bug
  2. Python的可视化包 – Matplotlib 2D图表(点图和线图,.柱状或饼状类型的图),3D图表(曲面图,散点图和柱状图)...
  3. html5三国策略布阵,丰神三国怎样布阵 布阵方法推荐
  4. 用什么写php最好用,php用什么开发工具比较好
  5. 利用 Python / R 对数据集进行「长」「宽」转换
  6. 你手上的PCB怎么制作的?几张动图揭晓工厂生产流程
  7. OpenCV——图像显示与写入
  8. 编译moveit!时缺失manipulation_msgs相关文件
  9. 软件测试需注意的事项
  10. android os苹果手机助手,深度系统V20(1003)内测招募:新增手机助手,支持安卓/iOS端...
  11. 拓端tecdat|Python、R对小说进行文本挖掘和层次聚类可视化分析案例
  12. 魔域私服怎么老服务器中断,魔域私服技术文章-服务器端比较正确的数据库解释文件...
  13. 信道编码-RS-CRC-交织(一)
  14. SAP 入门学习途径——官方工具使用
  15. mysql64官网下教程_最新版MySQL 8.0.22下载安装超详细教程(Windows 64位)
  16. 线段树合并学习笔记(P4556)
  17. webpack4打包js
  18. 小程序----个人中心页面
  19. 基于Arcgis对流域数据的提取及计算
  20. iOS 获取手机型号信息大全

热门文章

  1. 了解vue里的Runtime Only和Runtime+Compiler
  2. Odoo(OpenERP)配置文件详解
  3. 遗传算法在JobShop中的应用研究(part1: 绪论)
  4. 收不到Win10正式版预订通知?一个批处理搞定
  5. JTree用法及JTree使用经验总结转
  6. [再寄小读者之数学篇](2014-06-22 求导数 [中国科学技术大学2014年高等数学B考研试题])...
  7. Vs2012 打开项目 自动关闭 并停止工作 解决方法
  8. 产品设计的从0到1全流程:以优惠券为例
  9. 直播「拯救」互联网?
  10. 初创公司根本没数据,增长黑客个屁