【BZOJ1488】[HNOI2009]图的同构(Burside引理,Polya定理)

题面

BZOJ

洛谷

题解

求本质不同的方案数,很明显就是群论这套理论了。

置换一共有\(n!\)个,考虑如何对于任意一个置换求不动点数量。

首先边存在或者不存在太麻烦了,我们假装所有边都已经存在,出现过的边和不存在的边用两种不同的颜色染色即可。这样子我们就假装所有的边都出现了,也就是一个完全图。

显然循环是对于点而论的,但是这题同构是对于边而论的。那么我们对于一个点的循环,考虑它的两个顶点。这两个顶点只有两种不同情况,要么在同一个循环内,要么不在同一个循环内。考虑所有在同一个循环中的\(n\)点形成的完全图,那么它的边构成了\(n/2\)个循环,感性理解就是,我们把\(n\)个点拉成一排,把相邻距离为定值的点连上边,显然这样子会构成一个环,因为这个距离的定值\(d\)和\(n-d\)是等价的,所以边构成了\(n/2\)个循环。

考虑两个顶点不在一个循环内,那么构成循环必定是在一个点集中选择一条边连向另外一个点集,再从另外一个点集中选一条边连回来,我们把点集看成两个环,那么每次可以把环上所有的点旋转一下,那么旋转\(lcm\)次之后就转回来了,意味着这\(lcm\)条边必须相同,即构成一个循环,那么边的循环的个数就是\(gcd\)了。

假设有边的置换,我们很容易知道不动点的数量就是\(2^m\),其中\(m\)是边置换的数量,显然你的个置换中的边的颜色都是相同的。

这样一来,我们就把点置换转换为边置换了,这样就可以方便的计算了。

\(60\)的拆分数大概是百万级别的,我们似乎是可以爆搜拆分数计算答案的。

那么考虑一个拆分数实际上对应的方案数,这个排列组合计算一下就好了。

我们假设有\(k\)个循环,每个的大小分别是\(a_1,a_2,...\),每个大小的置换个数是\(num_1,num_2...\)

那么这种情况的贡献就是\(\frac{n!}{(\prod a_i!)*(\prod num_i!)}\),原因就是,\(n!\)是所有方案,然后对于每个置换内,显然环的位置不影响,出去等价的环,然后对于每个等大小的置换,显然位置是可以交换的,那么除去阶乘的排列的影响。

好了,这样子大概可以算完所有置换的不动点数量,然后除掉一个置换总数就对了,显然置换总数是\(n!\)。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MOD 997
#define MAX 75
int n,ans,jc[MOD],inv[MOD],jv[MOD];
int g[MAX][MAX],a[MAX],b[MAX],bin[MAX*MAX];
void calc()
{
int ret=jc[n],tot=0,sum=0;
for(int i=1;i<=n;++i)
{
ret=ret*jv[a[i]]%MOD;
for(int j=1;j<=a[i];++j)
ret=ret*inv[i]%MOD,b[++tot]=i;
}
for(int i=1;i<=tot;++i)sum+=b[i]/2;
for(int i=1;i<=tot;++i)
for(int j=i+1;j<=tot;++j)
sum+=g[b[i]][b[j]];
ret=ret*bin[sum]%MOD;
ans=(ans+ret)%MOD;
}
void dfs(int x,int sum)
{
if(x==1){a[x]=n-sum;calc();return;}
for(int i=0;sum+i*x<=n;++i)
a[x]=i,dfs(x-1,sum+i*x);
}
int main()
{
scanf("%d",&n);
jc[0]=jv[0]=inv[0]=inv[1]=bin[0]=1;
for(int i=2;i<MOD;++i)inv[i]=inv[MOD%i]*(MOD-MOD/i)%MOD;
for(int i=1;i<MOD;++i)jc[i]=jc[i-1]*i%MOD;
for(int i=1;i<MOD;++i)jv[i]=jv[i-1]*inv[i]%MOD;
for(int i=1;i<MAX*MAX;++i)bin[i]=bin[i-1]*2%MOD;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
g[i][j]=__gcd(i,j);
dfs(n,0);ans=ans*jv[n]%MOD;
printf("%d\n",ans);return 0;
}

【BZOJ1488】[HNOI2009]图的同构(Burside引理,Polya定理)的更多相关文章

  1. bzoj1488 [HNOI2009]图的同构 Burnside 引理

    题目传送门 bzoj1488 - [HNOI2009]图的同构 bzoj1815 - [Shoi2006]color 有色图(双倍经验) 题解 暴力 由于在做题之前已经被告知是 Burnside 引理 ...

  2. burnside引理&polya定理

    burnside引理&polya定理 参考资料: <polya计数法的应用>--陈瑜希 黄学长 置换: 置换即是将n个元素的染色进行交换,产生一个新的染色方案. 群: 一个元素的集 ...

  3. [bzoj1488][HNOI2009]图的同构——Polya定理

    题目大意 求两两互不同构的含n个点的简单图有多少种. 简单图是关联一对顶点的无向边不多于一条的不含自环的图. a图与b图被认为是同构的是指a图的顶点经过一定的重新标号以后,a图的顶点集和边集能完全与b ...

  4. bzoj1488[HNOI2009]图的同构

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1488 1488: [HNOI2009]图的同构 Time Limit: 10 Sec  M ...

  5. 【uva 10294】 Arif in Dhaka (First Love Part 2) (置换,burnside引理|polya定理)

    题目来源:UVa 10294 Arif in Dhaka (First Love Part 2) 题意:n颗珠子t种颜色 求有多少种项链和手镯 项链不可以翻转 手镯可以翻转 [分析] 要开始学置换了. ...

  6. 等价类计数:Burnside引理 & Polya定理

    提示: 本文并非严谨的数学分析,有很多地方是自己瞎口胡的,仅供参考.有错误请不吝指出 :p 1. 群 1.1 群的概念 群 \((S,\circ)\) 是一个元素集合 \(S\) 和一种二元运算 $ ...

  7. hdu 5868 2016 ACM/ICPC Asia Regional Dalian Online 1001 (burnside引理 polya定理)

    Different Circle Permutation Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K ...

  8. BZOJ 1488 Luogu P4727 [HNOI2009]图的同构 (Burnside引理、组合计数)

    题目链接 (Luogu) https://www.luogu.org/problem/P4727 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.ph ...

  9. [BZOJ1815&BZOJ1488]有色图/图的同构(Polya定理)

    由于有很多本质相同的重复置换,我们先枚举各种长度的点循环分别有多少个,这个暴搜的复杂度不大,n=53时也只有3e5左右.对于每种搜索方案可以轻易求出它所代表的置换具体有多少个. 但我们搜索的是点置换组 ...

随机推荐

  1. jquery訪问ashx文件演示样例

    .ashx 文件用于写web handler的..ashx文件与.aspx文件类似,能够通过它来调用HttpHandler类,它免去了普通.aspx页面的控件解析以及页面处理的过程.事实上就是带HTM ...

  2. 在 R 中估计 GARCH 参数存在的问题

    目录 在 R 中估计 GARCH 参数存在的问题 GARCH 模型基础 估计 GARCH 参数 fGarch 参数估计的行为 结论 译后记 在 R 中估计 GARCH 参数存在的问题 本文翻译自< ...

  3. 20155227《网络对抗》Exp5 MSF基础应用

    20155227<网络对抗>Exp5 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode exploit:把实现设置好的东西送到要攻击的主机里. ...

  4. 20155238 2016-2017-2 《JAVA程序设计》第十周学习总结

    教材学习内容总结 # Java计算机网络基础 计算机网络 计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使 ...

  5. [c#][福利]BTTool种子文件修改工具

    前言 不知道各位看官是否有过类似的经历.好不容易找到一个电影的种子文件,想用百度云的离线下载功能去下载文件,却被百度云无情提示“离线文件因含有违规内容被系统屏蔽无法下载”!假设有这么一个场景,比如最近 ...

  6. [GitHub]GitHub for Windows离线安装的方法

    这几天一直在尝试安装GitHub for windows ,安装程序是从https://windows.github.com/ 下载到的OneClick 部署程序,版本号为2.11.0.5.可能是因为 ...

  7. 汇编 REPE/REPZ 指令,CMPSB指令

    知识点: REPE/REPZ 指令 CMPSB 指令 一.CMPSB //cmp //sub //SCASB//scasw//scasd cmp byte ptr [edi],al //对标志位的 ...

  8. python 回溯法 子集树模板 系列 —— 19、野人与传教士问题

    问题 在河的左岸有N个传教士.N个野人和一条船,传教士们想用这条船把所有人都运过河去,但有以下条件限制: (1)修道士和野人都会划船,但船每次最多只能运M个人: (2)在任何岸边以及船上,野人数目都不 ...

  9. 从字节码层面,解析 Java 布尔型的实现原理

    最近在系统回顾学习 Java 虚拟机方面的知识,其中想到一个很有意思的问题:布尔型在虚拟机中到底是什么类型? 要想解答这个问题,我们看 JDK 的源码是无法解决源码的,我们必须深入到 class 文件 ...

  10. Edit Distance问题在两种编程范式下的求解

    本文已授权 [Coding博客](https://blog.coding.net) 转载 前言 Edit Distance,中文叫做编辑距离,在文本处理等领域是一个重要的问题,以下是摘自于百度百科的定 ...