Description

给一张 \(n\) 个点的无向完全图,同时还有 \(m\) 种颜色。要求给每条边染色,问有多少种不同的染色方案。两种方案不同当且仅当顶点标号任意重排后不同。\(n\leq 53\)。

Solution

好吧上课讲的题我还研究了一整个二晚的题解 上课睡觉就是不应该

首先这题要求边的不同染色方案,如果要用 \(burnside\) 或者 \(polya\) 那一套的话需要求边的置换,但是判断方案是否相同又是点的置换。好吧我们考虑点的置换看看在中间能不能统计出来边的置换的方案数。

把一个点置换搞出来,它含有若干轮换 \((a_1,a_2\dots)(b_1,b_2\dots)\dots\)

考虑这若干轮换中的边置换产生的轨道数。分以下两种情况考虑:

  1. 考虑两个端点分别在两个轮换 \(a,b\) 中的边。设 \(a,b\) 的长度分别是 \(l_1,l_2\),那么总点数就是 \(l_1\cdot l_2\) 个,循环节是 \(\operatorname{lcm}(l_1,l_2)\),所以一共有 \(\gcd(l_1,l_2)\) 个轨道。
  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] 有色图的更多相关文章

  1. 洛谷 P4128 [SHOI2006]有色图 解题报告

    P4128 [SHOI2006]有色图 题目描述 如果一张无向完全图(完全图就是任意两个不同的顶点之间有且仅有一条边相连)的每条边都被染成了一种颜色,我们就称这种图为有色图.如果两张有色图有相同数量的 ...

  2. 洛谷 P4128: bzoj 1815: [SHOI2006]有色图

    题目传送门:洛谷 P4128. 计数好题,原来是 13 年前就出现了经典套路啊.这题在当年应该很难吧. 题意简述: \(n\) 个点的完全图,点没有颜色,边有 \(m\) 种颜色,问本质不同的图的数量 ...

  3. BZOJ1815 SHOI2006有色图(Polya定理)

    置换数量是阶乘级别的,但容易发现本质不同的点的置换数量仅仅是n的整数拆分个数,OEIS(或者写个dp或者暴力)一下会发现不是很大,当n=53时约在3e5左右. 于是暴力枚举点的置换,并且发现根据点的置 ...

  4. P4128 [SHOI2006]有色图

    传送门 数学渣渣看题解看得想死Ծ‸Ծ 首先发现这玩意儿看着很像polya定理 \[L=\frac{1}{|G|}\sum_{i\in G}m^{w(i)}\] 然而polya定理只能用来求点的置换,边 ...

  5. bzoj 1815: [Shoi2006]color 有色图 置换群

    1815: [Shoi2006]color 有色图 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 136  Solved: 50[Submit][Stat ...

  6. BZOJ1815: [Shoi2006]color 有色图

    BZOJ1815: [Shoi2006]color 有色图 Description Input 输入三个整数N,M,P 1< = N <= 53 1< = M < = 1000 ...

  7. BZOJ 1815: [Shoi2006]color 有色图(Polya定理)

    题意 如果一张无向完全图(完全图就是任意两个不同的顶点之间有且仅有一条边相连)的每条边都被染成了一种颜色,我们就称这种图为有色图. 如果两张有色图有相同数量的顶点,而且经过某种顶点编号的重排,能够使得 ...

  8. BZOJ 1815: [Shoi2006]color 有色图 [Polya DFS 重复合并]

    传送门 题意: 染色图是无向完全图,且每条边可被染成k种颜色中的一种.两个染色图是同构的,当且仅当可以改变一个图的顶点的编号,使得两个染色图完全相同.问N个顶点,k种颜色,本质不同的染色图个数(模质数 ...

  9. [SHOI2006]color 有色图[群论、组合计数]

    题意 用 \(m\) 种颜色,给 \(n\) 个点的无向完全图的 \(\frac{n(n-1)}{2}\) 条边染色,两种方案相同当且仅当一种方案交换一些点的编号后可以变成另一种方案.问有多少本质不同 ...

随机推荐

  1. JavaScript 排序算法

    排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个对象呢?直接比较数学上的大小是没有意义的,因此,比较的 ...

  2. Spring-Data-JPA @Query注解 Sort排序

    当我们使用方法名称很难,达到预期的查询结果,就可以使用@Query进行查询,@Query是一种添加自定义查询的便利方式 (方法名称查询见http://blog.csdn.net/niugang0920 ...

  3. PowerShell 命令行调试指引(转)

    How to manage a debugging session Before you start debugging, you must set one or more breakpoints. ...

  4. Python开发——5.函数

    一.函数的定义 def test(x) "The Function definitions" x += return x def:定义函数的关键字 test:函数名 ():定义形参 ...

  5. DL_1_week2_神经网络基础

    二分类问题 在二分分类问题中,目标是训练出一个分类器,这里以图片特征向量x作为输入,预测输出的结果标签y是1还是0,也就是预测图片中是否有猫.          计算机保存一张图片(彩色),要保存三个 ...

  6. 【repost】javascript:;与javascript:void(0)使用介绍

    有时候我们在编写js过程中,需要触发事件而不需要返回值,那么就可能需要这样的写法 最近看了好几个关于<a>标签和javascript:void(0)的帖子,谨记于此,以资查阅. 注:以下代 ...

  7. The First BoKe

    A.如何看待师生关系 说起师生关系,我们每个人都有不同的见解,但无一例外,师者,传道授业解惑也,老师的为学生传授的才能知识,是学生今后发展的宝贵财富,无论是从哪方面,都可以对学生起着积极向上的作用.而 ...

  8. Mysql主从复制读写分离

    一.前言:为什么MySQL要做主从复制(读写分离)?通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低.为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来 ...

  9. Android开发 - 掌握ConstraintLayout(四)创建基本约束

    上一篇我们介绍了编辑器的基本使用,本文我们介绍创建基本的约束. "约束"表示View之间的位置关系.当我们在ConstraintLayout布局中创建View时,如果我们没有添加任 ...

  10. boost::bind 实现原理, 手动实现一个

    template<typename R, typename T, typename A1> class hangj_call { public: hangj_call(R (T::*f_) ...