Description

求两两互不同构的含n个点的简单图有多少种。

简单图是关联一对顶点的无向边不多于一条的不含自环的图。

a图与b图被认为是同构的是指a图的顶点经过一定的重新标号以后,a图的顶点集和边集能完全与b图一一对应。

Solution

转化模型:给边 \(0/1\) 染色,如果为 \(1\) 则代表选择,求方案数

考虑一下这个题的置换实际上是边置换,而把边置换用到的节点集合拿出来,发现这些点集合也可以是点置换

于是我们想到用把边置换按照点置换归类

于是复杂度就从边数降到点数了,枚举点置换的复杂度实际上是求 \(n\) 的划分的复杂度,\(n=60\) 时,约为 \(10^6\) 级别

问题在于如何统计点置换中的边循环个数

利用 \(polya\) 公式:

\(L=\frac{1}{|G|}*\sum_{i∈ G} 2^k_i\)

\(k_i\) 是每一个置换的循环的个数

考虑边的两端点都在同一点置换的边置换个数

这个置换的要求是:经过每一个点至少一次且形成一个环

观察一个例子



我们可以走相邻的点(也就是红边)

或者隔两个点走一步(绿边)

然后发现隔三个点走的走出来的和绿边一模一样,于是算重了

于是总结出规律: 隔 \(i\)和\(n-i\) 个点走出来的边置换是一样的,所以边置换个数就是 \(\frac{n}{2}\)

再考虑两端点都不在同以点置换的边置换个数

我们反复横跳两个点置换,直到某个时刻都遍历完,循环的大小为 \(lcm(a,b)\),\(a,b\) 为两个循环的大小

因为总边数是 \(a*b\) ,所以循环个数就为 \(\frac{a*b}{lcm(a,b)}=gcd(a,b)\)

最后就只要统计点置换的个数了

容易发现就是: \(\frac{n!}{size[1]*size[2]*...*size[n]*t[1]!*t[2]!*...*t[n]!}\)

\(size\) 表示每一个点置换的大小, \(t[i]\) 表示大小为 \(i\) 的点置换的个数

因为点是一个环,所以多枚举了 \(size\) 次,另外对于大小为 \(i\) 的连通块出现了多次,相当于一个可重排列,除以 \(t[1]!\)

最后总置换个数是 \(n!\),要记得除

#include<bits/stdc++.h>
using namespace std;
const int mod=997,N=65;
int n,num=0,sz[N],w[N],Fac[N],ans=0;
inline int qm(int x,int k){
int sum=1;
while(k){
if(k&1)sum=1ll*sum*x%mod;
x=1ll*x*x%mod;k>>=1;
}
return sum;
}
inline int gcd(int a,int b){return b?gcd(b,a%b):a;}
inline void dfs(int B,int res){
if(!res){
int sam=1,tot=0;
for(int i=1;i<=num;i++){
tot+=sz[i]*(sz[i]-1)/2*w[i]+w[i]/2*sz[i];
for(int j=i+1;j<=num;j++)
tot+=sz[i]*sz[j]*gcd(w[i],w[j]);
}
for(int i=1;i<=num;i++)
sam=sam*Fac[sz[i]]*qm(w[i],sz[i])%mod;
sam=Fac[n]*qm(sam,mod-2)%mod;
ans=(ans+qm(2,tot)*sam)%mod;
return ;
}
if(B==n+1 || B>res)return ;
dfs(B+1,res);
for(int i=1;i*B<=res;i++){
w[++num]=B;sz[num]=i;
dfs(B+1,res-i*B);
num--;
}
}
int main(){
scanf("%d",&n);
Fac[0]=1;for(int i=1;i<=n;i++)Fac[i]=Fac[i-1]*i%mod;
dfs(1,n);
ans=ans*qm(Fac[n],mod-2)%mod;
printf("%d\n",ans);
return 0;
}

bzoj 1488: [HNOI2009]图的同构的更多相关文章

  1. BZOJ 1488: [HNOI2009]图的同构 polay

    题意:两个图AB同构:把A的顶点重新编号后与B一模一样.求n个顶点的图一共有多少个?(同构的算一种) 思路:边有n*(n-1)/2,这些边可以有可以没有,所以等同于边的颜色有两种.然后将n划分成循环节 ...

  2. BZOJ 1488: [HNOI2009]图的同构 [Polya]

    完全图中选出不同构的简单图有多少个 上题简化版,只有两种颜色....直接copy就行了 太诡异了,刚才电脑上多了一个不动的鼠标指针,然后打开显卡管理界面就没了 #include<iostream ...

  3. bzoj 1488: [HNOI2009]图的同构【polya定理+dfs】

    把连边和不连边看成黑白染色,然后就变成了 https://www.cnblogs.com/lokiii/p/10055629.html 这篇讲得好!https://blog.csdn.net/wzq_ ...

  4. bzoj1488[HNOI2009]图的同构

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

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

    [BZOJ1488][HNOI2009]图的同构(Burside引理,Polya定理) 题面 BZOJ 洛谷 题解 求本质不同的方案数,很明显就是群论这套理论了. 置换一共有\(n!\)个,考虑如何对 ...

  6. [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并)

    [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并) 题面 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1 ...

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

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

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

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

  9. bzoj 1483 [HNOI2009]梦幻布丁(链表+启发式合并)

    1483: [HNOI2009]梦幻布丁 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1818  Solved: 761[Submit][Status ...

随机推荐

  1. 项目Alpha冲刺Day10

    一.会议照片 二.项目进展 1.今日安排 解决前后台联调问题,完善全局的请求和路由跳转处理,添加空文件完善路由信息,优化界面跳转等待.完成个人信息和修改密码.修改前台数据组织和方法调用方式.解决登录和 ...

  2. 201621123035 《Java程序设计》第1周学习总结

    1.本周学习总结 本周学习内容:Java平台概论.认识JDK规范与操作.了解JVM.JRE与JDK.撰写Java原始码.path是什么 关键词:JVM.JRE.JDK 联系:JVM是Java虚拟机的缩 ...

  3. string类的简洁版实现

    说是原创,差不多算是转载了,我也是看了好多大牛的写法,大牛的建议,自己加一总结,形成代码: 实现一个简洁版的string类,我觉得,下面的也够了:另外需要参见另外的写法: http://blog.cs ...

  4. 使用Putty连接Amazon EC2 Instance

    Amazon的EC2中,默认是不允许使用用户名和密码直接连接Instance的,而是通过AWS (Amazon Web Service)提供的证书.在第一次使用EC2的时候,AWS会要求你创建一个证书 ...

  5. Vim 游戏 2048

    给大家介绍一款可以在Vim里面玩的游戏 vim2048. 界面如图: 操作非常简单,可以用 hjkl 或者 上下左右方向键移动 项目开源地址为: https://github.com/wsdjeg/v ...

  6. MSIL实用指南-一维数组的操作

    本篇讲解怎么生成和操作一维数组.各种数组类型创建的步骤是一样的,但是加载和保存步骤有所不同. 一.创建数组所有类型的一维数组创建都是一样的,分三步.1.加载数组长度2.生成指令 Newarr < ...

  7. 裸辞两个月,海投一个月,从Android转战Web前端的求职之路

    前言 看到这个标题的童鞋,可能会产生两种想法: 想法一:这篇文章是标题党 想法二:Android开发越来越不景气了吗?前端越来越火了吗? 我一向不喜欢标题党,标题中的内容是我的亲身经历.我是2016年 ...

  8. 使用 slf4j抽象日志层 和 其他日志实现对接

    前言 如果你正在提供一个开源的Java-jar,那么让你的项目仅依赖slf4j-api然后让你的用户在他们开发和运营环境中选择任意的日志实现绝对是个好想法,.作为终端用户,他们可以快速地从上面提到的日 ...

  9. Mysql官方文档翻译系列-7.3.1 Establishing a Backup Policy

    原文链接 (https://dev.mysql.com/doc/refman/5.7/en/backup-policy.html) 正文 To be useful, backups must be s ...

  10. Django ORM创建数据库

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...