因为要求本质不同的图,容易想到群论。

为了方便处理,将边是否存在转化为边的黑白染色问题(实际上就是 \([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)=\dfrac{n!}{\prod\limits_{i=1}^ka_i\prod\limits_{i=1}^nb_i!}
\]

将 \(num(a)\) 带入原式得:

\[ans=\sum\limits_a2^{f(a)}(\prod\limits_{i=1}^ka_i\prod\limits_{i=1}^nb_i!)^{-1}
\]
\[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)
\]
#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] 图的同构计数的更多相关文章

  1. 【BZOJ1488】[HNOI2009]图的同构计数

    题目链接 题意 求 n 个点的同构意义下不同的图的数量.\((n\leq 60)\) Sol \(Polya\) 定理的练手题. 我们这里先把边的存在与否变成对边进行黑白染色,白色代表不存在,这样就变 ...

  2. 【BZOJ1488】[HNOI2009]图的同构(Burside引理,Polya定理)

    [BZOJ1488][HNOI2009]图的同构(Burside引理,Polya定理) 题面 BZOJ 洛谷 题解 求本质不同的方案数,很明显就是群论这套理论了. 置换一共有\(n!\)个,考虑如何对 ...

  3. bzoj1488[HNOI2009]图的同构

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1488 1488: [HNOI2009]图的同构 Time Limit: 10 Sec  M ...

  4. bzoj1488 [HNOI2009]图的同构 Burnside 引理

    题目传送门 bzoj1488 - [HNOI2009]图的同构 bzoj1815 - [Shoi2006]color 有色图(双倍经验) 题解 暴力 由于在做题之前已经被告知是 Burnside 引理 ...

  5. BZOJ 1488 Luogu P4727 [HNOI2009]图的同构 (Burnside引理、组合计数)

    题目链接 (Luogu) https://www.luogu.org/problem/P4727 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.ph ...

  6. BZOJ 1488: [HNOI2009]图的同构 polay

    题意:两个图AB同构:把A的顶点重新编号后与B一模一样.求n个顶点的图一共有多少个?(同构的算一种) 思路:边有n*(n-1)/2,这些边可以有可以没有,所以等同于边的颜色有两种.然后将n划分成循环节 ...

  7. BZOJ 1488: [HNOI2009]图的同构 [Polya]

    完全图中选出不同构的简单图有多少个 上题简化版,只有两种颜色....直接copy就行了 太诡异了,刚才电脑上多了一个不动的鼠标指针,然后打开显卡管理界面就没了 #include<iostream ...

  8. [HNOI2009]图的同构

    Description 求两两互不同构的含n个点的简单图有多少种. 简单图是关联一对顶点的无向边不多于一条的不含自环的图. a图与b图被认为是同构的是指a图的顶点经过一定的重新标号以后,a图的顶点集和 ...

  9. [bzoj1488][HNOI2009]图的同构——Polya定理

    题目大意 求两两互不同构的含n个点的简单图有多少种. 简单图是关联一对顶点的无向边不多于一条的不含自环的图. a图与b图被认为是同构的是指a图的顶点经过一定的重新标号以后,a图的顶点集和边集能完全与b ...

  10. bzoj 1488: [HNOI2009]图的同构

    Description 求两两互不同构的含n个点的简单图有多少种. 简单图是关联一对顶点的无向边不多于一条的不含自环的图. a图与b图被认为是同构的是指a图的顶点经过一定的重新标号以后,a图的顶点集和 ...

随机推荐

  1. Vue 二维码组件

    1.前言 该组件依赖qrcode.js与element-ui 支持二维码大小配置,点击大图预览 该组件以vue文件形式进行封装,需要配置httpVueLoader插件进行引入,其他格式请自行更改源码 ...

  2. 正也科技S2P 数字化推动医药信息传播多元化

    在当今数字化迅猛发展的时代浪潮中,医药信息传播正经历着深刻而广泛的变革.这种变革犹如一场波澜壮阔的革命,席卷了医药领域的每一个角落,对医药行业的发展产生了深远且不可忽视的影响. 一.传播渠道的多元化拓 ...

  3. Linux查看进程所在目录

    通过ps 或 top 查看进程信息时,只能查到进程的相对路径,查不到进程的详细信息,如绝对路径等,我们可以通过下面的方法进行查询 1. 通过ll /proc/PID 命令查看进程所在的目录位置 lin ...

  4. AE对象序列化

    当我们编写AE程序时,通常会遇到需要存储某个AE对象的情况,比如Layer,Element,Map,Legend,NorthArrow等等这些.举个例子说明一下:在我们编辑Featurelayer时, ...

  5. angr-ctf

    angr 的项目地址 https://github.com/jakespringer/angr_ctf angr实战 00 拖到IDA 就是输入正确的指令才能通关 这次试一下用angr来解题 goah ...

  6. Node开发规范v1.0

    一.空格与格式 (一)缩进 采用2个空格缩进,而不是tab缩进. 空格在编辑器中与字符是等宽的,而tab可能因编辑器的设置不同.2个空格会让代码看起来更紧凑.明快. 变量声明 永远用var声明变量,不 ...

  7. postgresql序列重复问题处理

    问题 在执行数据插入时,postgresql 提示more than one owned sequence found错误.这个和之前文章中写的序列编号错乱不同,是由数据表的一个列生成了多个序列导致的 ...

  8. How to Disable SELinux in Ubuntu Server/Desktop

    https://www.configserverfirewall.com/ubuntu-linux/disable-selinux-ubuntu/ In this tutorial I will ex ...

  9. Win11右键显示更多选项设置教程

    Win11如何设置右键显示更多选项?如果你觉得每次右键菜单,都是需要点击"显示更多选项"十分麻烦,那么可以通过设置,让其直接显示出现.那么应该如何操作呢?下面小编就为大家带来具体的 ...

  10. 抛出 NoClassDefFoundError: javax/validation/constraints/Size 问题的解决方法

    Error:java: java.lang.NoClassDefFoundError: javax/validation/constraints/Size 问题很明显,找不到相关类.我们可以在 pom ...