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

为了方便处理,将边是否存在转化为边的黑白染色问题(实际上就是 \([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. Java 设计模式——从冰雪经济看设计模式的综合运用(工厂、单例、策略、观察者)

    当冬季的寒风拂过大地,冰雪经济如同一颗璀璨的明珠,在寒冷中散发着炽热的魅力.滑雪场.冰雕展.冰雪主题酒店等各类冰雪产业蓬勃发展,其背后的运营逻辑和策略,与 Java 设计模式有着奇妙的相似之处,为我们 ...

  2. vue组件传参props

    传参格式,将需要传的参数以属性方式写在组件标签上 //组件标签 <zu a='参数一' b='参数b'></zu> 接收格式,在组件内 //props属性接收参数 props: ...

  3. Vite项目无法通过IP+端口的方式访问开发服务

    前情 最近要新开一个项目,技术栈由自己安排,于是就想到使用vue3+vite来做,体验一把新技术栈 坑位 vite开发体验极佳,但是在项目完成的时候,想通过本地服务提前发给产品确认UI.交互等细节的时 ...

  4. Ubuntu22.04安装cuda12.1+cudnn8.9.2+TensorRT8.6.1+pytorch2.3.0+opencv_cuda4.9+onnxruntime-gpu1.18

    说来话长,我想配一个一劳永逸的环境,方便以后复用.省的以后反复查教程重新装了 1. 安装miniconda+py3.10 cd /root wget -q https://repo.anaconda. ...

  5. IDA+kali 远程动态调试

    一.找到IDA文件目录下的 linux_server和linux_server64 复制到kali中去 给权限: chmod a+x ./linux_server chmod a+x ./linux_ ...

  6. 12C++循环结构-for循环(2)——教学

    一.循环变量为字符型 (第32课 26个兄弟姐妹)参考视频1 试编一程序,按字典顺序输出26个字母. 流程图: 思考:先顺序输出26个小写英文字母,再逆序输出26个大写英文字母. 循环可以是递增型循环 ...

  7. 【数据结构】【折半查找法】【二分查找法】Java代码

    public class half { public static int find(int[] nums,int num){ int max=nums.length-1; int min=0; in ...

  8. mysql:sql create database新建utf8mb4 数据库

    create database sina default character set utf8mb4 collate utf8mb4_unicode_ci;或者是create database con ...

  9. vue基础5

    1.组件通信 a.父传子: // 总结:1.父传子:传递的是基础数据类型 给父组件中的子组件绑定属性,此时属性的值在父组件中已经定义,子组件需要通过porps接收,要用数组接收 在子组件中直接渲染接收 ...

  10. Ceisum三维场景demo

    技术栈&资源 框架:EarthSDK(基于cesium二次开发包) 底图:Arcgis公开地图服务 楼栋白膜:自有shape数据,使用CesiumLab切片为tileset.json glb模 ...