P4128 [SHOI2006]有色图

题目描述

如果一张无向完全图(完全图就是任意两个不同的顶点之间有且仅有一条边相连)的每条边都被染成了一种颜色,我们就称这种图为有色图。如果两张有色图有相同数量的顶点,而且经过某种顶点编号的重排,能够使得两张图对应的边的颜色是一样的,我们就称这两张有色图是同构的。以下两张图就是同构的,因为假如你把第一张图的顶点\((1,2,3,4)\)置换成第二张图的\((4,3,2,1)\),就会发现它们是一样的。

你的任务是,对于计算所有顶点数为\(n\),颜色种类不超过\(m\)的图,最多有几张是两两不同构的图。由于最后的答案会很大,你只要输出结论模\(p\)的余数就可以了(\(p\)是一个质数)

输入输出格式

输入格式:

输入文件只有一行,由三个正整数\(n,m,p\)组成,他们满足\(1≤n≤53\),\(1≤m≤1000\),\(n<p≤10^9\)

输出格式:

即总数模\(p\)后的余数


我们发现\(polya\)处理的是点的置换,现在要处理边的,怎么办呢?

其实是一样的,我们发现每个点的置换都可以对应一个边的置换,边的置换同样构成了一个群,注意这个群的大小和点的置换组成的群的大小是一样的。

然后我们枚举本质不同的点的置换,这个本质不同是按轮换大小的集合定义的,相当于对\(n\)进行和式拆分,相当于\(n=L_1+L_2+\dots+L_p\),\(L\)是每个轮换的大小,这个状态量是比较小的。

注意搜的时候为了避免重复,需要\(L_1\le L_2\le \dots L_p\)这样搜

这时候就可以通过点的置换求出边的置换的轮换大小的信息了。

分类讨论

  • 当两个点处于两个不同轮换\(L_i\)和\(L_j\)中时,产生的边的轮换的大小为$\frac{L_i,L_j}{lcm(L_i,L_j)}=\gcd(i,j) $,就是考虑两个点一起转,然后要转公倍数那么长才回来
  • 当两个点处于同一轮换\(L_i\)中时
    • 当\(L_i\)为奇数,轮换个数为\(\frac{L_i*(L_i-1)}{2*L_i}=\frac{L_i-1}{2}\),每个轮换长度为\(L_i\)
    • 当\(L_i\)为偶数,轮换个数为\(\frac{\frac{L_i(L_i-1)}{2}-\frac{L_i}{2}}{L}+1=\frac{L_i}{2}\),这里有一个轮换长度为\(\frac{L_i}{2}\),是相差长度等于\(\frac{L_2}{2}\)的点组成的边所在的集合。

然后统计所有轮换的贡献\(C=\sum\lfloor\frac{L_1}{2}\rfloor+\sum\sum \gcd(L_i,L_j)\)

再统计一下枚举的\(L\)的总情况,为\(D=\frac{n!}{\prod_{i=1}^pL_i\prod_{i=1}^kB_i}\),其中\(B_i\)为\(\sum_{j=1}^p[L_j=i]\),这点除\(L_i\)是每种情况都是一个圆排列,除\(B_i\)是每个同样大小的圆排列是无标号的。

答案是\(\frac{\sum Dm^C}{n!}\)


#include <cstdio>
int ans,L[60],fac[60],n,m,mod,cnt;
#define mul(a,b) (1ll*(a)*(b)%mod)
#define add(a,b) ((a+b)%mod)
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int qp(int d,int k){int f=1;while(k){if(k&1)f=mul(f,d);d=mul(d,d),k>>=1;}return f;}
void cal()
{
int C=0,S=1;
for(int i=1;i<=cnt;i++)
C=add(C,L[i]/2);
for(int i=1;i<=cnt;i++)
for(int j=i+1;j<=cnt;j++)
C=add(C,gcd(L[i],L[j]));
int B=1;
for(int i=1;i<=cnt;i++)
{
if(L[i]!=L[i-1])
{
S=mul(S,fac[B]);
B=0;
}
++B;
S=mul(S,L[i]);
}
S=mul(S,fac[B]);
S=qp(S,mod-2);
C=qp(m,C);
ans=add(ans,mul(S,C));
}
void dfs(int res,int lim)
{
if(!res) cal();
for(int i=lim;i<=res;i++)
{
L[++cnt]=i;
dfs(res-i,i);
--cnt;
}
}
int main()
{
scanf("%d%d%d",&n,&m,&mod);
fac[0]=1;
for(int i=1;i<=n;i++) fac[i]=mul(fac[i-1],i);
dfs(n,1);
printf("%d\n",ans);
return 0;
}

2018.12.22

洛谷 P4128 [SHOI2006]有色图 解题报告的更多相关文章

  1. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  2. 洛谷 P4597 序列sequence 解题报告

    P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...

  3. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  4. 洛谷 P3349 [ZJOI2016]小星星 解题报告

    P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...

  5. 洛谷 P3177 树上染色 解题报告

    P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...

  6. 洛谷 P4705 玩游戏 解题报告

    P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...

  7. 洛谷 P1272 重建道路 解题报告

    P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...

  8. 洛谷 [HNOI2014]道路堵塞 解题报告

    [HNOI2014]道路堵塞 题意 给一个有向图并给出一个这个图的一个\(1\sim n\)最短路,求删去这条最短路上任何一条边后的最短路. 又事SPFA玄学... 有个结论,新的最短路一定是\(1\ ...

  9. 洛谷 P1452 Beauty Contest 解题报告

    P1452 Beauty Contest 题意 求平面\(n(\le 50000)\)个点的最远点对 收获了一堆计算几何的卡点.. 凸包如果不保留共线的点,在加入上凸壳时搞一个相对栈顶,以免把\(n\ ...

随机推荐

  1. wpf在image控件上快速显示内存图像

    这是在博客园的第一篇文章 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包含图像头等信息)快速显示到界面,那么 ...

  2. mac上搭建appium+IOS自动化测试环境(二)

    上一篇: mac上搭建appium+IOS自动化测试环境(一) 9.安装appium-xcuitest-driver依赖 进入WebDriverAgent安装目录,运行bootstrap 首先进入目录 ...

  3. NIKTO介绍及使用方法

    1.    NIKTO:perl语言开发的开源WEB安全扫描器:识别网站软件版本:搜索存在安全隐患的文件:检查服务器配置漏洞:检查WEB Application层面的安全隐患:避免404误判(原因:很 ...

  4. 木马分析出现python语言,360的安全人员不禁感叹还有这种操作?

    几年前,敲诈者木马还是一个默默无闻的木马种类.然而,由于其极强的破坏力和直接且丰厚的财富回报,敲诈者木马这几年已经一跃成为曝光率最高的木马类型——甚至超越了盗号木马.远控木马.网购木马这传统三强.与此 ...

  5. 【坚持】Selenium+Python学习之从读懂代码开始 DAY4

    2018/05/21 [生成器详解:廖雪峰的官方网站](https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d ...

  6. 深度学习中数据的augmentation

    为了提高模型的泛化能力,同时也为了增大数据集,我们往往需要对数据进行augmentation,在这篇博客中,将总结一下可以对数据进行的augmentation. 1.颜色数据增强,对图像亮度.饱和度. ...

  7. 微信JS-SDK实现上传图片功能

    最近在项目开发中,有一个在微信WEB项目中上传图片的需求,一开始使用了传统的<input type="file">的方式去实现,但是后面发现在使用这种传统模式时会由于手 ...

  8. IIS 无法加载 CSS,JS的问题

    IIS 能加载 aspx,但不能加载里面的 js,css ,感觉有点坑. 解决方案如下:http://www.pageadmin.net/article/20121001/479.html 原来是没有 ...

  9. 后端程序员必备的Linux基础知识

    我自己总结的Java学习的系统知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: https://github.com/Snailclimb/Java-Guide > ...

  10. js备忘录1

    新建对象 赋值和取值操作 var book={ topic:"JavaScript", fat: true }; book.topic  通过点访问 book["fat& ...