[SHOI2006] 有色图
Description
给一张 \(n\) 个点的无向完全图,同时还有 \(m\) 种颜色。要求给每条边染色,问有多少种不同的染色方案。两种方案不同当且仅当顶点标号任意重排后不同。\(n\leq 53\)。
Solution
好吧上课讲的题我还研究了一整个二晚的题解 上课睡觉就是不应该
首先这题要求边的不同染色方案,如果要用 \(burnside\) 或者 \(polya\) 那一套的话需要求边的置换,但是判断方案是否相同又是点的置换。好吧我们考虑点的置换看看在中间能不能统计出来边的置换的方案数。
把一个点置换搞出来,它含有若干轮换 \((a_1,a_2\dots)(b_1,b_2\dots)\dots\)
考虑这若干轮换中的边置换产生的轨道数。分以下两种情况考虑:
- 考虑两个端点分别在两个轮换 \(a,b\) 中的边。设 \(a,b\) 的长度分别是 \(l_1,l_2\),那么总点数就是 \(l_1\cdot l_2\) 个,循环节是 \(\operatorname{lcm}(l_1,l_2)\),所以一共有 \(\gcd(l_1,l_2)\) 个轨道。
- 对于两个端点在一个轮换 \(a\) 中的边,要分轮换的长度奇偶性来考虑。
- 如果 \(l_1\) 是奇数,那么循环节是 \(l_1\),一共有 \(C(l_1,2)\) 个点对,所以一共有 \(\frac{l_1-1}2\) 个轨道。
- 如果 \(l_1\) 是偶数,那么循环节是 \(l_1\) 或者 \(\frac{l_1}2\),因为两点的距离恰好是 \(\frac{l_1}2\) 的时候循环节只能是 \(\frac{l_1}2\) 就重复了。所以一共有 \(\frac{C(l_1,2)-\frac{l_1}2}{l_1}+1=\frac{l_1}2\) 个轨道。
最后要求的就是对于当前已经分好组的轮换组,有多少个置换满足这个条件。
emmm这个就相当于把 \(n\) 个人分配到 \(k\) 个长度给定的独立的圆排列里,然后经过一番神仙推导得出总分配数为 \(\frac{n!}{\prod\limits_{i=1}^k l_i\prod\limits_{i=1}^n B_i!}\)。其中 \(B_i\) 为 \(l_x=i\) 的 \(x\) 的个数。
最后记得除以 \(n!\)。
Code
#include<bits/stdc++.h>
using std::min;
using std::max;
using std::swap;
using std::vector;
typedef double db;
typedef long long ll;
#define pb(A) push_back(A)
#define pii std::pair<int,int>
#define all(A) A.begin(),A.end()
#define mp(A,B) std::make_pair(A,B)
const int N=60;
#define inv(x) ksm(x,mod-2)
int a[N],b[N];
int l[N],fac[N];
int n,m,mod,cnt,ans;
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int ksm(int a,int b,int ans=1){
while(b){
if(b&1) ans=1ll*ans*a%mod;
a=1ll*a*a%mod;b>>=1;
} return ans;
}
int getint(){
int X=0,w=0;char ch=getchar();
while(!isdigit(ch))w|=ch=='-',ch=getchar();
while( isdigit(ch))X=X*10+ch-48,ch=getchar();
if(w) return -X;return X;
}
void solve(int n){
memset(b,0,sizeof b);
for(int i=1;i<=n;i++) b[l[i]]++;
ll now=0;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
(now+=gcd(l[i],l[j]))%=mod;
for(int i=1;i<=n;i++)
(now+=l[i]/2)%=mod;
ll noww=1;
for(int i=1;i<=n;i++)
(noww*=l[i])%=mod;
for(int i=1;i<=::n;i++)
(noww*=fac[b[i]])%=mod;
ans=(1ll*ksm(noww,mod-2)*fac[::n]%mod*ksm(m,now)%mod+ans)%mod;
}
void dfs(int now,int res,int las){
if(!res){solve(now-1);return;}
for(int i=las;i<=res;i++){
l[now]=i;
dfs(now+1,res-i,i);
}
}
signed main(){
n=getint(),m=getint(),mod=getint();
fac[0]=1;
for(int i=1;i<=53;i++) fac[i]=1ll*fac[i-1]*i%mod;
dfs(1,n,1);
printf("%lld\n",1ll*ans*inv(fac[n])%mod);
return 0;
}
[SHOI2006] 有色图的更多相关文章
- 洛谷 P4128 [SHOI2006]有色图 解题报告
P4128 [SHOI2006]有色图 题目描述 如果一张无向完全图(完全图就是任意两个不同的顶点之间有且仅有一条边相连)的每条边都被染成了一种颜色,我们就称这种图为有色图.如果两张有色图有相同数量的 ...
- 洛谷 P4128: bzoj 1815: [SHOI2006]有色图
题目传送门:洛谷 P4128. 计数好题,原来是 13 年前就出现了经典套路啊.这题在当年应该很难吧. 题意简述: \(n\) 个点的完全图,点没有颜色,边有 \(m\) 种颜色,问本质不同的图的数量 ...
- BZOJ1815 SHOI2006有色图(Polya定理)
置换数量是阶乘级别的,但容易发现本质不同的点的置换数量仅仅是n的整数拆分个数,OEIS(或者写个dp或者暴力)一下会发现不是很大,当n=53时约在3e5左右. 于是暴力枚举点的置换,并且发现根据点的置 ...
- P4128 [SHOI2006]有色图
传送门 数学渣渣看题解看得想死Ծ‸Ծ 首先发现这玩意儿看着很像polya定理 \[L=\frac{1}{|G|}\sum_{i\in G}m^{w(i)}\] 然而polya定理只能用来求点的置换,边 ...
- bzoj 1815: [Shoi2006]color 有色图 置换群
1815: [Shoi2006]color 有色图 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 136 Solved: 50[Submit][Stat ...
- BZOJ1815: [Shoi2006]color 有色图
BZOJ1815: [Shoi2006]color 有色图 Description Input 输入三个整数N,M,P 1< = N <= 53 1< = M < = 1000 ...
- BZOJ 1815: [Shoi2006]color 有色图(Polya定理)
题意 如果一张无向完全图(完全图就是任意两个不同的顶点之间有且仅有一条边相连)的每条边都被染成了一种颜色,我们就称这种图为有色图. 如果两张有色图有相同数量的顶点,而且经过某种顶点编号的重排,能够使得 ...
- BZOJ 1815: [Shoi2006]color 有色图 [Polya DFS 重复合并]
传送门 题意: 染色图是无向完全图,且每条边可被染成k种颜色中的一种.两个染色图是同构的,当且仅当可以改变一个图的顶点的编号,使得两个染色图完全相同.问N个顶点,k种颜色,本质不同的染色图个数(模质数 ...
- [SHOI2006]color 有色图[群论、组合计数]
题意 用 \(m\) 种颜色,给 \(n\) 个点的无向完全图的 \(\frac{n(n-1)}{2}\) 条边染色,两种方案相同当且仅当一种方案交换一些点的编号后可以变成另一种方案.问有多少本质不同 ...
随机推荐
- 字符编码中ASCII、Unicode和UTF-8的区别
1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte). ...
- zookeeper 服务挂掉重启后,dubbo 服务是不会自动重新注册上的
今天遇到一个问题: 系统初始有两个dubbo 服务 , A 和 B , 都是正常注册到zookeeper 上的, 但是zookeeper 服务机房 断电导致 服务宕机, 那就重启吧. 一切正常. 但是 ...
- flex布局之flex-basis采坑
场景: 容器设置为display: flex,容器里的子项目部分设置 flex: auto,子项目的宽高自适应正常,但如果再往子项目里嵌套一个(如:div),并设置高度(如:height: 100%) ...
- 关于git 命令的一些事
克隆代码命令 http://www.yiibai.com/git/git_clone.html 关键:得实现新建本地仓库文件夹 ==> git clone 远程网址 git 上传主要代码:htt ...
- 做到让DBCP连接池不超时
前些天部署了一个项目,但每次隔一段时间打开都会报如下所示的错误: javax.servlet.ServletException: org.springframework.transaction.Ca ...
- 关于HttpClient,HttpURLConnection,OkHttp的用法
1 HttpClient入门实例 1.1发送get请求 /** * HttpClient发送get请求 * @param url 请求地址 * @return * @throws IOExceptio ...
- php SQL 防注入的一些经验
产生原因 一方面自己没这方面的意识,有些数据没有经过严格的验证,然后直接拼接 SQL 去查询.导致漏洞产生,比如: $id = $_GET['id']; $sql = "SELECT nam ...
- 将json对象转化成jsonp对象
这个Demo用来检查是否具有唯一性 //检查 /user/check/{param}/{type} @RequestMapping("/check/{param}/{type}") ...
- Jquery 图片走马灯效果原理
本篇只讲解水平走马灯效果,垂直向上走马灯效果不讲解,原理一样,但是水平走马灯效果有一个小坑.待会讲解 照例先上代码: HTML: <div class="box"> & ...
- 使用netstat命令查看端口的使用情况
Windows如何查看端口占用情况操作步骤如下: 开始--运行--cmd 进入命令提示符,输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管 ...