[HNOI2009] 图的同构计数
因为要求本质不同的图,容易想到群论。
为了方便处理,将边是否存在转化为边的黑白染色问题(实际上就是 \([SHOI2006]\) 有色图 的弱化版本,最终公式也差不多)。
根据 \(Burnside\) 引理和 \(Polya\) 定理,将问题转化为:对于每种置换方案,有多少个边的等价类。
考虑对于一种置换方案 \(g\),设它有 \(k_g\) 个循环节,每个循环节长度为 \(a_{g,i}\)。
现在我们将问题分为两个部分:循环节内的等价类数量和循环节间的等价类数量。
对于循环节内部,容易想到将其转化为一个正 \(a_{g,i}\) 边形,其中长度相同的边在同一等价类中,所以循环节内部等价类数量就是 \(\sum\lfloor \dfrac{a_{g,i}}{2}\rfloor\)。
对于循环节间,为了让其对齐,所以要进行 \(\text{lcm}(a_{g,i},a_{g,j})\) 次轮换才能对齐一次,所以等价类个数为 \(\dfrac{a_{g,i}\times a_{g,j}}{\text{lcm}(a_{g,i},a_{g,j})}=\gcd(a_{g,i},a_{g,j})\)。
那么对于一个置换 \(g\),它的等价类总数就是 \(f'(g)=\sum\limits_{i=1}^{k_g}\lfloor\dfrac{a_{g,i}}{2}\rfloor+\sum\limits_{i=1}^{k_g-1}\sum\limits_{j=i+1}^{k_g}\gcd(a_{g,i},a_{g,j})\)。
根据 \(Burnside\) 引理,答案就是 \(\dfrac{1}{|G|}\sum\limits_{g\in G}2^{f'(g)}\)。
但是由于 \(|G|=n!\),所以仍然无法通过。考虑枚举 \(a_g\) 数组。
设 \(f(a)=\sum\limits_{i=1}^{k}\lfloor \dfrac{a_i}{2}\rfloor+\sum\limits_{i=1}^{k-1}\sum\limits_{j=i+1}^k\gcd(a_i,a_j)\),\(num(a)\) 表示循环节情况为 \(a\) 的置换的个数,则答案可以改写为 \(\dfrac{1}{|G|}\sum\limits_a2^{f(a)}num(a)\)。
这里 \(dfs\) 拆分 \(n\) 为多个数的和时间复杂度不会证,但是应该没有问题,以后再补这个锅吧。
那么问题来到了如何求解 \(num(a)\) 上。
首先将 \(n\) 个数分到 \(a_i\) 里,方案数为 \(\dfrac{n!}{\prod_{i=1}^ka_i!}\),乘上圆排列的方案数 \(\prod_{i=1}^k(a_i-1)!\),得方案数为 \(\dfrac{n!}{\prod_{i=1}^ka_i}\)。
但这样并不正确,因为相同长度的循环节可以互相交换,导致重复。因此设 \(b_i=\sum\limits_{j=1}^k[a_j=i]\),于是就可以得到最终形态:
\]
将 \(num(a)\) 带入原式得:
\]
\]
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=65,p=997;
int n,ans,a[N],b[N],jc[N],gc[N][N];
int gcd(int x,int y){
return !y?x:gcd(y,x%y);
}int qpow(int x,int y){
int re=1;
while(y){
if(y&1) re=re*x%p;
x=x*x%p,y>>=1;
}return re;
}void check(int k){
int f=0,prd=1;
for(int i=1;i<=k;i++){
f+=a[i]/2;
for(int j=i+1;j<=k;j++)
f+=gc[a[i]][a[j]];
}for(int i=1;i<=k;i++)
prd=prd*a[i]%p;
for(int i=1;i<=n;i++)
prd=prd*jc[b[i]]%p;
ans=(ans+qpow(2,f)*qpow(prd,p-2))%p;
}void dfs(int x,int num,int lst){
if(!num) return check(x-1),void();
for(int i=lst;i<=num;i++)
b[i]++,a[x]=i,dfs(x+1,num-i,i),b[i]--;
}signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n,jc[0]=1;
for(int i=1;i<=n;i++)
jc[i]=jc[i-1]*i%p;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
gc[i][j]=gcd(i,j);
dfs(1,n,1),cout<<ans;
return 0;
}
[HNOI2009] 图的同构计数的更多相关文章
- 【BZOJ1488】[HNOI2009]图的同构计数
题目链接 题意 求 n 个点的同构意义下不同的图的数量.\((n\leq 60)\) Sol \(Polya\) 定理的练手题. 我们这里先把边的存在与否变成对边进行黑白染色,白色代表不存在,这样就变 ...
- 【BZOJ1488】[HNOI2009]图的同构(Burside引理,Polya定理)
[BZOJ1488][HNOI2009]图的同构(Burside引理,Polya定理) 题面 BZOJ 洛谷 题解 求本质不同的方案数,很明显就是群论这套理论了. 置换一共有\(n!\)个,考虑如何对 ...
- bzoj1488[HNOI2009]图的同构
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1488 1488: [HNOI2009]图的同构 Time Limit: 10 Sec M ...
- bzoj1488 [HNOI2009]图的同构 Burnside 引理
题目传送门 bzoj1488 - [HNOI2009]图的同构 bzoj1815 - [Shoi2006]color 有色图(双倍经验) 题解 暴力 由于在做题之前已经被告知是 Burnside 引理 ...
- BZOJ 1488 Luogu P4727 [HNOI2009]图的同构 (Burnside引理、组合计数)
题目链接 (Luogu) https://www.luogu.org/problem/P4727 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.ph ...
- BZOJ 1488: [HNOI2009]图的同构 polay
题意:两个图AB同构:把A的顶点重新编号后与B一模一样.求n个顶点的图一共有多少个?(同构的算一种) 思路:边有n*(n-1)/2,这些边可以有可以没有,所以等同于边的颜色有两种.然后将n划分成循环节 ...
- BZOJ 1488: [HNOI2009]图的同构 [Polya]
完全图中选出不同构的简单图有多少个 上题简化版,只有两种颜色....直接copy就行了 太诡异了,刚才电脑上多了一个不动的鼠标指针,然后打开显卡管理界面就没了 #include<iostream ...
- [HNOI2009]图的同构
Description 求两两互不同构的含n个点的简单图有多少种. 简单图是关联一对顶点的无向边不多于一条的不含自环的图. a图与b图被认为是同构的是指a图的顶点经过一定的重新标号以后,a图的顶点集和 ...
- [bzoj1488][HNOI2009]图的同构——Polya定理
题目大意 求两两互不同构的含n个点的简单图有多少种. 简单图是关联一对顶点的无向边不多于一条的不含自环的图. a图与b图被认为是同构的是指a图的顶点经过一定的重新标号以后,a图的顶点集和边集能完全与b ...
- bzoj 1488: [HNOI2009]图的同构
Description 求两两互不同构的含n个点的简单图有多少种. 简单图是关联一对顶点的无向边不多于一条的不含自环的图. a图与b图被认为是同构的是指a图的顶点经过一定的重新标号以后,a图的顶点集和 ...
随机推荐
- 『玩转Streamlit』--表单Form
在Streamlit中,Form组件是一种特殊的UI元素,允许用户输入数据而不立即触发应用的重新运行. 这对于创建需要用户输入多个参数后再进行处理的交互式表单非常有用. 1. 概要 Form组件的主要 ...
- 开源的 Linux 游戏平台「GitHub 热点速览」
<越狱>.<迷失>.<西部风云>等经典美剧背后的民间字幕翻译团队--人人影视,由于 AI 翻译的崛起.官方中文字幕的普及和版权问题,最终决定以开源的方式,为这段旅程 ...
- Spring框架IoC核心详解
介绍 IoC(Inversion of Control:控制反转) 是一种设计思想,而不是一个具体的技术实现.IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理,由S ...
- Win11右键显示更多选项设置教程
Win11如何设置右键显示更多选项?如果你觉得每次右键菜单,都是需要点击"显示更多选项"十分麻烦,那么可以通过设置,让其直接显示出现.那么应该如何操作呢?下面小编就为大家带来具体的 ...
- 使用JSch进行sftp的连接运行状况检查
public boolean checkConnection() throws JSchException { try { JSch jsch = new JSch(); Session sessio ...
- Java 随机数 Random VS SecureRandom
1. Math.random() 静态方法 产生的随机数是 0 - 1 之间的一个 double,即 0 <= random <= 1.使用: for (int i = 0; i < ...
- macOS 中有什么好用的虚拟机软件?
macOS 中有什么好用的虚拟机软件? https://www.zhihu.com/question/66366176/answer/268256386 问题:1.macOS是否有专门的虚拟机软件?或 ...
- Iframe标签显示目标网页的指定区域,视频可全屏可缩小
由于播放的直播视频有多余的logo和聊天框等所以需要去掉,用Iframe标签显示目标网页的指定区域,视频可全屏可缩小 用自己私人的服务器来测试吧,99买阿里云 HTML代码 <html> ...
- IM通讯协议专题学习(一):Protobuf从入门到精通,一篇就够!
本文由IBM开发者社区分享,有较多修订和改动. 1.引言 在当今移动网络时代,手机流量和电量是宝贵的资源,对于移动端最常见的即时通讯IM应用,由于实时通信基于Socket长连接,它对于流量和电量的需求 ...
- [LC646]最长数对链
题目概述 给出 n 个数对. 在每一个数对中,第一个数字总是比第二个数字小. 现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面.我们用这种形 ...