Solution -「HNOI 2009」「洛谷 P4727」图的同构计数
\(\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)\) 为
\]
考虑直接枚举 \(\{a_k\}\),则符合条件的转置方案数为
\]
其中 \(b_i=\sum_{j=1}^k[a_j=i]\),即大小为 \(i\) 的循环个数。组合意义为:在所有转置中,固定每个循环的第一个元素,再去除等大循环的顺序。
最终方案数为
\]
拆分 \(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」图的同构计数的更多相关文章
- 「区间DP」「洛谷P1043」数字游戏
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...
- 洛谷 P1596 [USACO10OCT]湖计数Lake Counting
题目链接 https://www.luogu.org/problemnew/show/P1596 题目描述 Due to recent rains, water has pooled in vario ...
- 洛谷P1144 最短路计数(SPFA)
To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M ...
- 洛谷 1144 最短路计数 bfs
洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移, ...
- 洛谷 P4017 最大食物链计数
洛谷 P4017 最大食物链计数 洛谷传送门 题目背景 你知道食物链吗?Delia生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条.于是她来就来求助你,然而你也不会啊!写 ...
- 动态规划 洛谷P4017 最大食物链计数——图上动态规划 拓扑排序
洛谷P4017 最大食物链计数 这是洛谷一题普及/提高-的题目,也是我第一次做的一题 图上动态规划/拓扑排序 ,我认为这题是很好的学习拓扑排序的题目. 在这题中,我学到了几个名词,入度,出度,及没有环 ...
- Solution -「JSOI 2019」「洛谷 P5334」节日庆典
\(\mathscr{Description}\) Link. 给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的). \(|S|\le3\time ...
- Solution -「洛谷 P4372」Out of Sorts P
\(\mathcal{Description}\) OurOJ & 洛谷 P4372(几乎一致) 设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...
- Solution -「POI 2010」「洛谷 P3511」MOS-Bridges
\(\mathcal{Description}\) Link.(洛谷上这翻译真的一言难尽呐. 给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...
随机推荐
- “老”的Flexbox和“新”的Flexbox
本文由大漠根据Chris Coyier的<"Old" Flexbox and "New" Flexbox>所译,整个译文带有我们自己的理解与思想,如 ...
- 51 Nod 1183 编辑距离 (动态规划基础)
原题链接:1183 编辑距离 题目分析:这个最少的操作次数,通常被称之为编辑距离."编辑距离"一次本身具有最短的意思在里面.因为题目有"最短"这样的关键词,首先 ...
- hadoop入门到实战(6)hive常用优化方法总结
问题导读:1.如何理解列裁剪和分区裁剪?2.sort by代替order by优势在哪里?3.如何调整group by配置?4.如何优化SQL处理join数据倾斜?Hive作为大数据领域常用的数据仓库 ...
- powershell基础知识
基本命令 我们先从最基本的命令入手,Windows Powershell命令中get类命令是很庞大的一个命令工具集合,而且get类命令也是Powershell中占比最大的. 1.Get-Alias G ...
- day 13 函数指针类型
(1).有以下程序: 则正确的选项是[B] (A).7 4 (B).4 10 (C).8 8 (D)10 10 分析:主要考求字符串的长度,strlen是专门求字符串长度的函数,但不包含'\0'在内. ...
- Git命令中波浪号~与脱字符^的区别
0.前言 波浪号~,英文名叫 tilde.脱字符^,英文名叫caret. 这两种符号常见于git reset的情景,简单的项目结构和操作一般不会涉及到两者之间的区别,似乎用哪个都可以.如果遇到比较繁杂 ...
- Message deduplication 这里的去重与你想的可能不一样|Apache Pulsar 技术系列
导语 Apache Pulsar 是一个多租户.高性能的服务间消息传输解决方案,支持多租户.低延时.读写分离.跨地域复制.快速扩容.灵活容错等特性.腾讯云内部 Pulsar工作组对 Pulsar 做了 ...
- Java on Visual Studio Code的更新 – 2022年1月
大家好,欢迎来到 Visual Studio Code Java 更新 1 月版!这是我们新年的第一篇博客,我们将回顾 2021 年的亮点,并分享我们 2022 年的产品路线图!除此之外我们还有一些令 ...
- 【webpack4.0】---webpack的基本使用(三)
一.webpack-dev-server 1.安装 cnpm install webpack-dev-server -D 2.作用 开启一个web服务,监听文件的变化并自动刷新网页,做到实时预 ...
- 云原生新时代弄潮儿k8s凭什么在容器化方面独树一帜?
云原生新时代弄潮儿k8s凭什么在容器化方面独树一帜? Kubernetes 可以为做些什么? 在学习一种新技能之前,囧囧建议不要上去先看各种牛叉的实现,我们需要先搞清楚这个技能是什么?学习了之后能为我 ...