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. ADO.net中DataTable的应用

     一.思维导图 二.知识点描述 (1)构造函数 DataTable() 不带参数初始化DataTable类的新实例 DataTable(string tableName) 用指定的表名初始化DataT ...

  2. Leetcode_6. Zigzag convertion

    6. Zigzag convertion 对输入的字符串做锯齿形变换,并输出新的字符串,所谓zigzag变化如下图所示. 将"ABCDEFGHIJKL"做4行的锯齿变换,新的字符串 ...

  3. Linux下端口映射工具rinetd

    Linux下简单好用的工具rinetd,实现端口映射/转发/重定向官网地址http://www.boutell.com/rinetd 软件下载wget http://www.boutell.com/r ...

  4. 【探路者】Beta发布用户使用报告

    用户数量:18 一.用户列表及评论.  用户序号 用户来源 用户下载软件途径 用户姓名 用户描述(信息) 使用次数 用户评价 1  张恩聚  QQ发送可运行jar包  周楠  吉林大学在读研究生  5 ...

  5. 2017年软件工程作业-“Hello World!”团队互评beta版本

    A.欢迎来怼——博客园安卓APP(测评人:刘淑霞) 博客地址:http://www.cnblogs.com/liusx0303/p/7905928.html B.Thunder——爱阅app(测评人: ...

  6. 使你的WebService可以远程调试点击“调用”

    默认发布webservice时,只有在本机访问某个方法时可以点击调用,如果有参数时,也可以输入参数值,但是如果是远程访问时,点击进入一个服务时,是不显示“调用”和输入参数框的. 原来web.confi ...

  7. Leetcode题库——11.盛最多水的容器

    @author: ZZQ @software: PyCharm @file: maxArea.py @time: 2018/10/11 21:47 说明:给定 n 个非负整数 a1,a2,...,an ...

  8. python learning Exception & Debug.py

    ''' 在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数open(),成功时返 ...

  9. 【奇奇怪怪的bug系列】微信小程序

    今天修改代码的时候,发现了一件让我很恐慌的事情,在app.json中修改页面路径顺序不起作用了: 这样我根本就看不到页面的效果啊??? 在折腾了半天后,才发现是一个比较乌龙的事情:昨天修改完首页后顺手 ...

  10. EasyUi模糊匹配搜索框combobox

    现在项目当中很多已经应用了Jquery-easyUi这个界面框架了,所以,学习一点easyUI的常用工具就显得很重要了,现在介绍的就是我在项目中用到的easyUi的模糊匹配组合框combobox. c ...