[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}\) 条边染色,两种方案相同当且仅当一种方案交换一些点的编号后可以变成另一种方案.问有多少本质不同 ...
随机推荐
- 目录命令(cd)
cd 命令: // 描述: (Change Directory) 更改当前目录或显示当前目录的名称. 如果仅使用驱动器号(例如,cd C :),则cd将显示指定驱动器中当前目录的名称. 如果不带参数使 ...
- PAT 1088 三人行 模拟,坑 C
PAT 1088 三人行 https://pintia.cn/problem-sets/994805260223102976/problems/1038429286185074688 题目: 子曰:“ ...
- EventTrigger动态添加监听事件
在 Unity3D 中,通过拖拽的方式在 EventTrigger 组件中添加监听事件就不多说了,很简单.这里主要说的是通过代码动态往 EventTrigger 组件中添加监听事件,有个很坑的地方,就 ...
- 2019swpuj2ee作业3
静态页面: 在网站设计中,纯粹html格式的网页通常被称为“静态网页”,早期的网站一般都是由静态网页制作的.静态网页是相对于动态网页而言,是指没有后台数据库.不含程序和不可交互的网页.你编的是什么它显 ...
- Android studio提速配置
1. C:\Program Files\Android\Android Studio\bin studio64.exe.vmoptions 2.创建 gradle.properties 配置文件
- linux下使用eclipse打开esp32工程文件,并进行编译下载。
在之前的文章中,已经讲过将esp-idf 运用linux自带的工具下载,但是为了开发的系统性,这里运用eclipse来对idf进行整体的编译. 首先 cd /esp32 运行eclipse,将work ...
- Visual Studio 2017中使用正则修改部分内容
最近在项目中想实现一个小工具,需要根据类的属性<summary>的内容加上相应的[Description]特性,需要实现的效果如下 修改前: /// <summary> /// ...
- Git使用01
git 工作区:当前编辑的区域 缓存区:add 之后的区域 本地仓库:commit之后的区域 远程仓库:远程的区域 git init 初始化 git status 查看git的状态 git add 将 ...
- 你不知道的javascript读书笔记3
概述 这是我看<你不知道的JavaScript(中卷)>中关于类型检查的笔记,供以后开发时参考,相信对其他人也有用. typeof 我们知道js中有七种内置类型:undefined, nu ...
- 往github提交代码流程
一 首先在Github新建一个仓库,回到首页,点击右上角的New repository新建仓库. 二 在本地依次使用下面命令 …or create a new repository on the c ...