【BZOJ1478】Sgu282 Isomorphism

题意:用$m$种颜色去染一张$n$个点的完全图,如果一个图可以通过节点重新标号变成另外一个图,则称这两个图是相同的。问不同的染色方案数。答案对$P$取模。

$n\le 53,m\le 1000,P>n,P$是质数。

题解:对于本题来说,每个元素是所有边,每个置换是边的置换,而边的置换难以表示,点的置换容易表示,所以我们考虑点置换和边置换的关系。

如果两个点置换有着相同的结构,则它们对应的边置换的循环数相同。

$$\begin{pmatrix}1&2&3 \ 2&1&3\end{pmatrix}\rightarrow\begin{pmatrix}(1,2)&(1,3)&(2,3) \ (1,2)&(2,3)&(1,3)\end{pmatrix}$$

$$\begin{pmatrix}1&2&3 \ 1&3&2\end{pmatrix}\rightarrow\begin{pmatrix}(1,2)&(1,3)&(2,3) \ (1,3)&(1,2)&(2,3)\end{pmatrix}$$

一个点置换的结构:在表示成循环节时,循环的大小依次为$L_1,L_2,...L_K$。

$L_1,L_2,...L_K$可以组成一个$n$的划分。

而当$n$=53时,$n$个划分数不超过$300000$。

可以通过搜索得出。

那么一个结构为$L_1,L_2,...L_K$的点置换对应边置换的循环数是什么呢?

对于端点在不同点循环中的边,设两端点所在点循环大小为$L_1,L_2$,则这样的边一共有$L_1\times L_2$条,而每个循环有$lcm(L_1,L_2)$条边,所以一共有$gcd(L_1,L_2)$个循环。

对于端点在同一点循环中的边,设所在点循环的大小为$L$,这样的边一共有$C_L^2$条。然后分奇偶讨论:

  1. 如果$L$是奇数,那么一个循环中有$L$条边,所以循环数为${C_L^2\over L}={L-1\over 2}$。
  2. 如果$L$是偶数,那么一个循环中有$L$条边,但是如果两端点相隔$L\over 2$,这个循环中有$L\over 2$条边。所以循环数为${C_L^2-{L\over 2}\over L}+1={L\over 2}$。

所以一个大小为$L$的点循环中边循环的数量是$\lfloor{L\over 2}\rfloor$。

结构为$L_1,L_2,...L_K$的点置换中边循环的数量就是

$$\sum\limits_{i=1}^n\lfloor{L_i\over 2}\rfloor+\sum\limits_{i=1}K\sum\limits_{j=1}{i-1}gcd(L_i,L_j)$$

那么有多少结构为$L_1,L_2...L_K$的点置换呢?可以先求出$n!\over {L_1!L_2!...L_K!}$得到每个点属于哪个循环的方案数,而对于每个循环,我们可以先确定第一个点,然后其余点任意排列,方案数是$(L_1-1)!(L_2-1)!...(L_K-1)!$。乘起来得到$n!\over {L_1L_2...L_k}$。

又由于存在一些$L$相等的情况,设有$t$种本质不同的$L$,每种个数为$B_i$,所以总方案数还要除掉$B_1!B_2!...B_t!$,所以总数为:

$$n!\over L_1L_2...L_KB_1!B_2!...B_t!$$

最后套上Pólya定理,令$c=\sum\limits_{i=1}^n\lfloor{L_i\over 2}\rfloor+\sum\limits_{i=1}K\sum\limits_{j=1}{i-1}gcd(L_i,L_j)$,$s={n!\over L_1L_2...L_KB_1!B_2!...B_t!}$,答案就是

$$\frac 1 {n!}\sum s\times m^c$$

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
ll P,ans;
int n,m;
ll jc[70],jcc[70],ine[70],pw[3700];
int g[70][70],v[70];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
inline ll C(int a,int b)
{
if(a<b) return 0;
return jc[a]*jcc[a-b]%P*jcc[b]%P;
}
void dfs(int len,int sum)
{
if(!sum)
{
ll s=jc[n],c=0;
int i,j,tmp;
for(i=1,tmp=0;i<=len;i++)
{
tmp++;
if(i==len||v[i]!=v[i+1]) s=s*jcc[tmp]%P,tmp=0;
s=s*ine[v[i]]%P;
c+=v[i]>>1;
for(j=1;j<i;j++) c+=g[v[j]][v[i]];
}
ans=(ans+pw[c]*s)%P;
return ;
}
for(int i=min(sum,v[len]);i>=1;i--) v[len+1]=i,dfs(len+1,sum-i);
}
int main()
{
n=rd(),m=rd(),P=rd();
int i,j;
for(pw[0]=i=1;i<=n*n/2;i++) pw[i]=pw[i-1]*m%P;
for(i=0;i<=n;i++) g[i][0]=i;
for(i=0;i<=n;i++) for(j=1;j<=i;j++) g[i][j]=g[j][i%j];
jc[1]=ine[1]=jcc[1]=jc[0]=ine[0]=jcc[0]=1;
for(i=2;i<=n;i++) jc[i]=jc[i-1]*i%P,ine[i]=P-(P/i)*ine[P%i]%P,jcc[i]=jcc[i-1]*ine[i]%P;
v[0]=n;
dfs(0,n);
printf("%lld",ans*jcc[n]%P);
return 0;
}

【BZOJ1478】Sgu282 Isomorphism Pólya定理神题的更多相关文章

  1. BZOJ1478 Sgu282 Isomorphism

    Problem A: Sgu282 Isomorphism Time Limit: 15 Sec  Memory Limit: 64 MBSubmit: 172  Solved: 88[Submit] ...

  2. [BZOJ1478&1488&1815][SGU282]Isomorphism:Polya定理

    分析 三倍经验题,本文以[BZOJ1478][SGU282]Isomorphism为例展开叙述,主体思路与另外两题大(wan)致(quan)相(yi)同(zhi). 这可能是博主目前写过最长也是最认真 ...

  3. Burnside引理&Pólya定理

    Burnside's lemma 引例 题目描述 一个由2*2方格组成的正方形,每个格子上可以涂色或不涂色, 问共有多少种本质不同的涂色方案. (若两种方案可通过旋转互相得到,称作本质相同的方案) 解 ...

  4. 【BZOJ 1478】 1478: Sgu282 Isomorphism (置换、burnside引理)

    1478: Sgu282 Isomorphism Description 给 定一个N 个结点的无向完全图( 任意两个结点之间有一条边), 现在你可以用 M 种颜色对这个图的每条边进行染色,每条边必须 ...

  5. POJ 2484 A Funny Game(神题!)

    一开始看这道博弈题的时候我就用很常规的思路去分析了,首先先手取1或者2个coin后都会使剩下的coin变成线性排列的长条,然后无论双方如何操作都是把该线条分解为若干个子线条而已,即分解为若干个子游戏而 ...

  6. BUAA 724 晴天小猪的神题(RMQ线段树)

    BUAA 724 晴天小猪的神题 题意:中文题,略 题目链接:http://acm.buaa.edu.cn/problem/724/ 思路:对于询问x,y是否在同一区间,可以转换成有没有存在一个区间它 ...

  7. Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题

    4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 177  Solved: 128[Submit][Status ...

  8. 置换群 Burnside引理 Pólya定理(Polya)

    置换群 设\(N\)表示组合方案集合.如用两种颜色染四个格子,则\(N=\{\{0,0,0,0\},\{0,0,0,1\},\{0,0,1,0\},...,\{1,1,1,1\}\}\),\(|N|= ...

  9. 【CF913F】Strongly Connected Tournament 概率神题

    [CF913F]Strongly Connected Tournament 题意:有n个人进行如下锦标赛: 1.所有人都和所有其他的人进行一场比赛,其中标号为i的人打赢标号为j的人(i<j)的概 ...

随机推荐

  1. InstallShield 制作MSI

    1.  click [project Assistant] 2. select [Build Installation], open this tab asfollow: 3.whenbuild ok ...

  2. CorelDRAW中如何再制对象详解

    再制对象指的是快捷地将对象按一定的方式复制为多个对象,此种复制是复制的复制,再制不仅可以节省复制的时间,再制间距还可以保证复制效果.本教程将详解如何在CorelDRAW软件中再制对象. CorelDR ...

  3. centos7系统下nginx安装并配置开机自启动操作

    准备工作 我的centos7系统是最小化安装的, 缺很多库, 首先安装必须的运行库 ? 1 2 3 4 5 6 7 8 9 10 11 yum install wget gcc gcc-c++ pcr ...

  4. Android零碎知识点 1

    Android零碎知识点 1   Android在2.3版本上开始支持KeyEvent.KEYCODE_PAGE_DOWN以及KeyEvent.KEYCODE_PAGE_UP的操作.   Androi ...

  5. 大杂烩 -- Java中Iterator的fast-fail分析

    基础大杂烩 -- 目录 Java中的Iterator非常方便地为所有的数据源提供了一个统一的数据读取(删除)的接口,但是新手通常在使用的时候容易报如下错误ConcurrentModificationE ...

  6. 5 -- Hibernate的基本用法 --4 5 JNDI数据源的连接属性

    如果无须Hibernate自己管理数据源,而是直接访问容器管理数据源,Hibernate可使用JNDI(Java Naming Directory Interface,Java命名目录接口)数据源的相 ...

  7. 8 -- 深入使用Spring -- 8...1 Spring提供的DAO支持

    8.8.1 Spring提供的DAO支持. DAO模式是一种标准的Java EE设计模式,DAO模式的核心思想是,所有的数据库访问都通过DAO组件完成,DAO组件封装了数据库的增.删.查.改等原子操作 ...

  8. iOS Ad hoc

    There's one situation in which you need an Ad Hoc profile, and that's when you want to test Push Not ...

  9. vs2010,vs2012如何连接vss2005,vss2008

    打开vs2010.依次打开[工具]-[选项]-[源代码管理] 这个时候可以看到管理插件中有Microsoft Visual SourceSafe选项(若没有该选项,重新安装VSS即可). 连接上项目后 ...

  10. sqlite3常用指令

    一.建立数据库 sqlite3.exe test.db 二.双击sqlite-3_6_16目录下的程序sqlite3.exe,即可运行 三.退出 .exit 或者 .quit 四.SQLite支持如下 ...