\(\mathcal{Description}\)

  Link.

  求含 \(n\) 个点的无标号简单无向图的个数,答案模 \(997\)。

\(\mathcal{Solution}\)

  首先,把题目转化成为有标号 \(K_n\) 的 \(\binom{n}{2}\) 条边染黑(不选)白(选)两种颜色,求本质不同(去除标号)的方案数。想到使用 Pólya 定理求解。设在某个点转置中,循环大小为 \(a_1,a_2,\cdots,a_k\),分别考虑循环内部和循环间的边等价类:

  对于大小为 \(a\) 的循环内部,仍旧是一个 \(K_a\),尝试求其中边等价类的个数,例如 \(a=6\),如图(来自 @pythoner713 的博客,下图同):

可见共红色、绿色、蓝色三个等价类。进一步,若把 \(K_a\) 画作类似的正多边形,发现边属于同一等价类当且仅当它们长度相等,继而得出大小为 \(a\) 的循环的等价类个数为 \(\lfloor\frac{a}{2}\rfloor\)。

  对于两个大小分别为 \(a,b\) 的循环之间,考虑转置它们直到与初始状态重合,如图:

循环大小为 \(\operatorname{lcm}(a,b)\),那么共 \(\gcd(a,b)\) 个等价类。

  综上,符合 \(\{a_k\}\) 所描述的转置的等价类个数 \(c(a)\) 为

\[\sum_{i=1}^k\lfloor\frac{a_i}{2}\rfloor+\sum_{1\le i<j\le k}\gcd(a_i,a_j)
\]

  考虑直接枚举 \(\{a_k\}\),则符合条件的转置方案数为

\[\frac{n!}{\prod_{i=1}^ka_i\prod_{i=1}^nb_i}
\]

其中 \(b_i=\sum_{j=1}^k[a_j=i]\),即大小为 \(i\) 的循环个数。组合意义为:在所有转置中,固定每个循环的第一个元素,再去除等大循环的顺序。

  最终方案数为

\[\frac{1}{n!}\sum_{\{a_k\}}2^{c(a)}\frac{n!}{\prod_{i=1}^ka_i\prod_{i=1}^nb_i}\\=\sum_{\{a_k\}}2^{c(a)}\left(\prod_{i=1}^ka_i\prod_{i=1}^nb_i\right)^{-1}
\]

拆分 \(n\) 求解即可,复杂度见 A296010

\(\mathcal{Code}\)

/* Clearink */

#include <cstdio>

#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) const int MOD = 997, MAXN = 60;
int n, fac[MAXN + 5]; inline int gcd( const int a, const int b ) { return b ? gcd( b, a % b ) : a; }
inline int mul( const long long a, const int b ) { return int( a * b % MOD ); }
inline int add( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
inline void addeq( int& a, const int b ) { ( a += b ) >= MOD && ( a -= MOD ); }
inline int mpow( int a, int b ) {
int ret = 1;
for ( ; b; a = mul( a, a ), b >>= 1 ) ret = mul( ret, b & 1 ? a : 1 );
return ret;
} int a[MAXN + 5], ans, t; inline int calc() {
t += a[0] * a[0];
int s = 1;
for ( int l = 1, r; l <= a[0]; l = r ) {
for ( r = l; r <= a[0] && a[l] == a[r]; ++r );
s = mul( s, fac[r - l] );
} int idx = 0;
rep ( i, 1, a[0] ) {
idx += a[i] >> 1, s = mul( s, a[i] );
rep ( j, i + 1, a[0] ) idx += gcd( a[i], a[j] );
} return mul( mpow( s, MOD - 2 ), mpow( 2, idx ) );
} inline void split( const int x, const int rest ) {
if ( !rest ) return addeq( ans, calc() );
if ( rest < x ) return ;
split( x + 1, rest );
a[++a[0]] = x, split( x, rest - x ), --a[0];
} int main() {
scanf( "%d", &n ); fac[0] = 1;
rep ( i, 1, n ) fac[i] = mul( i, fac[i - 1] ); split( 1, n ); printf( "%d\n", t );
return 0;
}

Solution -「HNOI 2009」「洛谷 P4727」图的同构计数的更多相关文章

  1. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  2. 洛谷 P1596 [USACO10OCT]湖计数Lake Counting

    题目链接 https://www.luogu.org/problemnew/show/P1596 题目描述 Due to recent rains, water has pooled in vario ...

  3. 洛谷P1144 最短路计数(SPFA)

    To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M ...

  4. 洛谷 1144 最短路计数 bfs

    洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移, ...

  5. 洛谷 P4017 最大食物链计数

    洛谷 P4017 最大食物链计数 洛谷传送门 题目背景 你知道食物链吗?Delia生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条.于是她来就来求助你,然而你也不会啊!写 ...

  6. 动态规划 洛谷P4017 最大食物链计数——图上动态规划 拓扑排序

    洛谷P4017 最大食物链计数 这是洛谷一题普及/提高-的题目,也是我第一次做的一题 图上动态规划/拓扑排序 ,我认为这题是很好的学习拓扑排序的题目. 在这题中,我学到了几个名词,入度,出度,及没有环 ...

  7. Solution -「JSOI 2019」「洛谷 P5334」节日庆典

    \(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\time ...

  8. Solution -「洛谷 P4372」Out of Sorts P

    \(\mathcal{Description}\)   OurOJ & 洛谷 P4372(几乎一致)   设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...

  9. Solution -「POI 2010」「洛谷 P3511」MOS-Bridges

    \(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...

随机推荐

  1. 编写Hive的UDF(查询平台数据同时向mysql添加数据)

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6812629187518530052/ 可能会有一些截图中会有错误提示,是因为本地的包一直包下载有问题,截完图已经下 ...

  2. Ubuntu16安装Nvidia驱动(GTX1060显卡)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. 图形验证插件,百度编辑器拓展功能,NodeJs消息机制以及聊天室

    图形验证插件 网上找了很多图形验证插件,比较推荐verify.js <link rel="stylesheet" type="text/css" href ...

  4. HDU-1004(C语言描述)

    Let the Balloon Rise 输入 输入包含多个测试用例.每个测试用例都以数字 N (0 < N < = 1000) 为起点, 分布的气球总数.下 N 行包含一个颜色.气球的颜 ...

  5. 解决excel两表之间数据关联关系,知道这几招就够了

    用过SAP的凭证批量录入模板(Excel文件)的都知道,一个凭证由[抬头]和多个[行项目]组成,这是一个关于excel两表信息关联的典型场景. 这里头蕴藏着一个麻烦:当我们需要一次性录入多个凭证时,如 ...

  6. Vulnhub系列——持续更新

    vulnhub系列--持续更新 一 · XXE Lab: 1 ​ 使用vmware搭建靶机 ​ 扫描存活主机 ​ 找到目标主机--192.168.1.18 ​ 开始扫描目标端口 ​ 发现只开了一个80 ...

  7. C# winform Visual Studio Installer打包教程,安装包

    //具体打包过程,参考下面网址 https://www.cnblogs.com/dongh/p/6868638.html VS 扩展和更新-联机 搜索 Microsoft Visual Studio ...

  8. 在DigitalOcean vps中安装vnstat监控流量,浏览器打开php代码。。。

    由于DigitalOcean中没有发现可以观察已用流量的功能,有想知道自己的流量使用情况,所以安装了vnstat. 安装过程十分简单,见百度经验,官方主页等. 1.安装完vnstat后,直接命令vns ...

  9. gin中提供静态文件服务

    package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { // 静 ...

  10. db2日志模式、备份归档、恢复解析

    DB2的日志分为两种模式,日志循环与归档日志,也就是非归档和归档模式.下面就具体介绍一下这两种方式以及和备份归档设置的关系. 一.日志循环 这是默认方式,也就是非归档模式,这种模式只支持(backup ...