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. github上传时出现error: src refspec master does not match any解决办法

    github上传时出现error: src refspec master does not match any解决办法 这个问题,我之前也遇到过,这次又遇到了只是时间间隔比较长了,为了防止以后再遇到类 ...

  2. JAVA_SE基础——20.数组的常见操作

    1.遍历数组 使用for循环来遍历数组 代码如下: public class Ergodic { public static void main(String[] args) { int[] arr ...

  3. linux的脚本应用for循环答应变量

    #!/bin/bash for var in A B C ; do echo "var is $var" done

  4. 点开GitHub之后,瑟瑟发抖...的我

    我说句实在话啊,GitHub这个网址真的很能勾起人学习的欲望,一进入GitHub的注册页面真的让我这个英语学渣瑟瑟发抖,瞬间立下个flag:好好学习英语..... 我对python的求知欲怎么能被英语 ...

  5. 【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类

    依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依 ...

  6. css3兼容IE8的方案 各个ie的hack

    虽然现在很多项目已经对低版本IE不要求了,但是还有部分公司对IE8还是很执着的,咱作为屌丝前端程序员不能和老板说前端潮流,不能说趋势,只能动脑子了,下面就分享一些css3兼容ie8的方案思路.主要是实 ...

  7. Python内置函数(9)——int

    英文文档: class int(x=0) class int(x, base=10) Return an integer object constructed from a number or str ...

  8. 以太坊挖矿源码:clique算法

    上文我们总结了以太坊最主要的共识算法:ethash算法,本文将重点分析以太坊的另一个共识算法:clique. 关键字:clique,共识算法,puppeth,以太坊地址原理,区块校验,认证结点,POA ...

  9. api-gateway实践(09)支持rest服务注册

    一.GET-GET 1.前端定义 2.后端定义 2.1.基础定义 2.2.path参数.head参数.query参数 2.3.常量参数 2.4.系统参数 2.5.结果定义 二.POST-POST 1. ...

  10. php程序报错:PHP Core Warning/cannot open shared object file: No such file or directory

    今天开发调试程序的时候报错了,现象是有时候刷新会出现如下图: 这种主要是找不到共享库文件,即.so文件,网上主要有3种解决方法: 1. 用ln将需要的so文件链接到/usr/lib或者/lib这两个默 ...