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. Beta 第三天

    今天遇到的困难: 组员对github极度的不适应 github的版本控制和协同化编程确实操作起来需要一定的熟练度,我们缺乏这种熟练度 Android Studio版本不一致项目难以打开的问题仍然无法解 ...

  2. C语言第三次作业总结

    本次作业的亮点 总体情况 大部分同学基本掌握了单层循环结构的写法,懂得了代码调试的过程 PTA通过率及作业质量都不错,希望再接再厉 推荐博客 黄毓颖 推荐理由:代码思路清晰,格式良好:调试过程相当形象 ...

  3. 敏捷冲刺每日报告一(Java-Team)

    第一天报告(10.25  周三) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://gi ...

  4. jwt验证登录信息

    为什么要告别session?有这样一个场景,系统的数据量达到千万级,需要几台服务器部署,当一个用户在其中一台服务器登录后,用session保存其登录信息,其他服务器怎么知道该用户登录了?(单点登录), ...

  5. 安装Loadrunner 11.0时,弹出缺少2.8 sp1组件--解决方案(win7)

    这是因为注册表缺少FullInstallVer和Version,归根到底是madc安装的的问题 以下是解决方法: 1.运行regedit,打开注册表,进入HKEY_LOCAL_MACHINE\SOFT ...

  6. 【微软大法好】VS Tools for AI全攻略

    大家都知道微软在Connect();17大会上发布了VS Tools for AI,旨在提升Visual Studio和VSCode对日益增长的深度学习需求的体验.看了一圈,网上似乎没有一个完整的中文 ...

  7. 关于 Form 表单的 enctype 属性

    enctype 属性一共有3个值 application/x-www-form-urlencoded 在发送前编码所有字符(默认) multipart/form-data 上传二进制数据, 所以在使用 ...

  8. python pickle 模块的使用

    用于序列化的两个模块 json:用于字符串和Python数据类型间进行转换 pickle: 用于python特有的类型和python的数据类型间进行转换 json提供四个功能:dumps,dump,l ...

  9. OAuth2.0学习(1-1)OAuth2.0是什么?

    目前很多开放平台如新浪微博开放平台都在使用提供开放API接口供开发者使用,随之带来了第三方应用要到开放平台进行授权的问题 OAuth就是用于为第三方应用授权访问用户的资源应用的. 目前有OAuth1. ...

  10. PHP / Laravel 月刊 #23

    最新资讯 Laravel 5.6 中文文档翻译完成,译者 60 人,耗时 10 天 Summer Dingo API 中文文档翻译召集[已完成] Summer 我最喜欢 Laravel 5.6 的三个 ...