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. C语言博客作业--函数嵌套调用

    一.实验作业(6分) 本周作业要求: 选一题PTA题目介绍. 学习工程文件应用,设计实现学生成绩管理系统. 学生成绩管理系统要求 设计一个菜单驱动的学生成绩管理程序,管理n个学生m门考试科目成绩,实现 ...

  2. 第二次作业:APP案例分析

    App案例分析 产品:三国杀-页游手游双通 选择理由 当今社会手机已经渐渐取代了电脑在人们日常生活的需求,既然要选择APP进行案例分析,首推的估计就是手机APP了.三国杀是陪伴我高中时代的主要娱乐方式 ...

  3. Hibernate之HQL

    SQL语句的DML操作不外乎:增,删,改,查 增加 :  save(),persist() 删除 :   delete() 改动 :   update() 查询  :  get() ,load() 其 ...

  4. Struts2之配置文件中Action的详细配置

    在Struts2之配置一文中,我们知道一个struts配置文件可以分为三部分:常量配置    包含其他配置文件的配置    Action配置  . 这其中 常量配置  和 包含其他配置文件的配置  二 ...

  5. thinkphp中的常见静态常亮

    thinkphp __PUBLIC__的定义 __ROOT__等常量的定义 1 2 3 4 5 6 7 8 9 '__TMPL__'      =>  APP_TMPL_PATH,  // 项目 ...

  6. 20道Java面试必考题

    系统整理了一下有关Java的面试题,包括基础篇,javaweb篇,框架篇,数据库篇,多线程篇,并发篇,算法篇等等,陆续更新中.其他方面如前端后端等等的面试题也在整理中,都会有的. 注:文末有福利!pd ...

  7. 从Mybatis源码理解jdk动态代理默认调用invoke方法

    一.背景最近在工作之余,把开mybatis的源码看了下,决定自己手写个简单版的.实现核心的功能即可.写完之后,执行了一下,正巧在mybatis对Mapper接口的动态代理这个核心代码这边发现一个问题. ...

  8. leetcode算法:Next Greater Element I

    You are given two arrays (without duplicates) nums1 and nums2 where nums1's elements are subset of n ...

  9. JavaScript实现接口的三种经典方式

    /* 接口:提供一种说明一个对象应该有哪些方法的手段 js中有三种方式实现接口: 1 注释描述接口 2 属性检测接口 3 鸭式辨型接口 */ /* 1 注释描述接口: 不推荐 优点: 利用注解,给出参 ...

  10. Spring(六):Spring&Struts2&Hibernate搭建的blog项目

    经过断断续续的学习.累积,终于基于别人的开源blog项目,变成了自己的第一个相对完整点的blog项目. 计划暂时把这个blog程序暂停------有更多(工作中用到的)东西需要去做,因此学习SSH b ...