题目链接

(Luogu) https://www.luogu.org/problem/P4727
(BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=1488

题解

Burnside引理经典题。

首先考虑一个\(O(n!\times poly(n))\)暴力: 枚举点的置换,然后计算在置换下保持不变的图的个数。
把置换拆成若干个轮换。

(1) 考虑轮换内部: 假设一轮换为\((a_1\ a_2\ ...\ a_n)\), 那么\((a_1,a_2),(a_2,a_3),...,(a_n,a_1)\)这些边要么都存在要么都不存在;\((a_1,a_3),(a_2,a_4),...,(a_{n-1},a_{1}),(a_{n},a_2)\)这些边也要么都存在要么都不存在;一般地说,对于任何一个\(d\), 所有的\((a_i,a_{(i+d)\mod n})\)这些边要么都存在要么都不存在,因此轮换内部一共有\(2^{\frac{n}{2}}\)种方案。

(2) 考虑轮换之间: 假设两轮换分别为\((a_1,a_2,...,a_n),(b_1,b_2,...,b_m)\)则有: \((a_1,b_1),(a_2,b_2),...(a_i,b_i)\)这些边存在情况都相同;\((a_1,b_2),(a_2,b_3),...,(a_i,b_{i+1})\)这些边存在情况都相同;以此类推,可以得到两轮换之间共有\(2^{\gcd(n,m)}\)种方案。
所有的置换方案数相加,最后除以置换总数\(n!\).

然后现在考虑\(n\le 60\)怎么办。
当\(n\le 60\)时,我们可以枚举拆分数(\(60\)的拆分数约为百万级别)。
已知一个拆分的方案(方案是指一个无标号序列\(a\)满足\(\sum a_i=n\),其长度为\(cnt\)),它对应了多少个不同排列的轮换分拆?
首先,长度为\(L\)的轮换共\((L-1)!\)种。
然后我们要处理标号问题。
假设轮换之间是有区别的,那么标号方案数为\(\frac{n!}{\prod^{cnt}_{i=1}a_i!}\).
但是长度相等的轮换之间没有区别,所以除以\(\prod {num_i!}\), 其中\(num_i\)表示\(i\)在\(a\)中的出现次数。
最后乘起来得到\(\frac{n!}{\prod^{cnt}_{i=1}a_i\prod^n_{i=1}num_i!}\)
累加即可。

时间复杂度?
枚举所有拆分方案,求\(cnt^2\)之和,我用程序计算得当\(n=60\)时该值约为\(2.7\times 10^8\).

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<iostream>
#define llong long long
using namespace std;inline int read()
{int x=0; bool f=1; char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=0;for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^'0');if(f) return x;return -x;
}const int N = 60;
const int P = 997;
llong fact[N+3],finv[N+3],inv[N+3];
llong pw2[N+3];
int a[N+3];
int num[N+3];
int gcd[N+3][N+3];
int n,cnt;
llong ans;int GCD(int x,int y)
{return y==0?x:GCD(y,x%y);
}llong quickpow(llong x,llong y)
{llong cur = x,ret = 1ll;for(int i=0; y; i++){if(y&(1ll<<i)) {y-=(1ll<<i); ret = ret*cur%P;}cur = cur*cur%P;}return ret;
}llong calc()
{llong ret = fact[n];for(int i=1; i<=cnt; i++){ret = ret*inv[a[i]]%P;}for(int i=1; i<=n; i++){ret = ret*finv[num[i]]%P;}for(int i=1; i<=cnt; i++){ret = ret*pw2[a[i]>>1]%P;}for(int i=1; i<=cnt; i++){for(int j=i+1; j<=cnt; j++){ret = ret*pw2[gcd[a[i]][a[j]]]%P;}}return ret;
}void dfs(int sum)
{if(sum==n){ans = (ans+calc())%P;return;}for(int i=a[cnt]; i+sum<=n; i++){cnt++; a[cnt] = i; num[i]++;dfs(i+sum);a[cnt] = 0; cnt--; num[i]--;}
}int main()
{pw2[0] = 1ll; for(int i=1; i<=N; i++) pw2[i] = (pw2[i-1]<<1)%P;fact[0] = 1ll; for(int i=1; i<=N; i++) fact[i] = fact[i-1]*i%P;finv[N] = quickpow(fact[N],P-2); for(int i=N-1; i>=0; i--) finv[i] = finv[i+1]*(i+1)%P;for(int i=1; i<=N; i++) inv[i] = finv[i]*fact[i-1]%P;for(int i=1; i<=N; i++) for(int j=1; j<=N; j++) gcd[i][j] = GCD(i,j);scanf("%d",&n);if(n==0) {printf("1"); return 0;}a[0] = 1; dfs(0);ans = ans*finv[n]%P;printf("%lld\n",ans);return 0;
}

BZOJ 1488 Luogu P4727 [HNOI2009]图的同构 (群论、Burnside引理、组合计数)相关推荐

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

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

  2. BZOJ 2281 Luogu P2490 [SDOI2011]黑白棋 (博弈论、DP计数)

    怎么SDOI2011和SDOI2019的两道题这么像啊..(虽然并不完全一样) 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?i ...

  3. Luogu P4708 画画 (Burnside引理、组合计数)

    题目链接 https://www.luogu.org/problem/P4708 题解 看上去Luogu P4706-4709是Sdchr神仙出的一场比赛,一道水题和三道很有趣的题终于全过了纪念QAQ ...

  4. Luogu P4708 画画 (Burnside引理、组合计数、划分数)

    题目链接 https://www.luogu.org/problem/P4708 题解 看上去Luogu P4706-4709是Sdchr神仙出的一场比赛,一道水题和三道很有趣的题终于全过了纪念QAQ ...

  5. Luogu P5564 [Celeste-B]Say Goodbye (多项式、FFT、Burnside引理、组合计数)

    题目链接 https://www.luogu.org/problem/P5564 题解 这题最重要的一步是读明白题. 为了方便起见下面设环长可以是\(1\), 最后统计答案时去掉即可. 实际上就相当于 ...

  6. UOJ #219 BZOJ 4650 luogu P1117 [NOI2016]优秀的拆分 (后缀数组、ST表)

    UOJ #219 BZOJ 4650 luogu P1117 [NOI2016]优秀的拆分 (后缀数组.ST表) 连NOI Day1T1都不会做...看了题解都写不出来还要抄Claris的代码.. 题 ...

  7. UOJ #131 BZOJ 4199 luogu P2178【NOI2015】品酒大会 (后缀自动机、树形DP)

    UOJ #131 BZOJ 4199 luogu P2178[NOI2015]品酒大会 (后缀自动机.树形DP) 水是水,但是写出了不少问题,因此写一发博客. https://www.luogu.or ...

  8. BZOJ 1500 Luogu P2042 [NOI2005] 维护数列 (Splay)

    BZOJ 1500 Luogu P2042 [NOI2005] 维护数列 (Splay) 手动博客搬家: 本文发表于20180825 00:34:49, 原地址https://blog.csdn.ne ...

  9. BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演)

    BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演) 手动博客搬家:本文发表于20180310 11:46:11, 原地址https://blog.csdn.net/suncongbo/ ...

最新文章

  1. mysql 5.6 rpm 安装_mysql 5.6 rpm 包安装步骤需要注意的地方
  2. android studio 链接编辑,Android Studio怎么连接手机测试程序?
  3. PHP MySQLi/PDO_MySQL/PDO_SQLite CRUD(增查改删)
  4. PCB设计必知:布局及设计规范
  5. jquery in action 学习笔记
  6. Hanlp中自定义词典的配置、引用以及问题解决
  7. 【人工智能中“预测”的知识点】
  8. 【UOJ】【34】多项式乘法
  9. win10中VM15内centos7的安装
  10. CentOS Linux解决Device eth0 does not seem to be pres
  11. linux at命令关机,Linux at命令定时关机
  12. RNN(LSTMGRU)文本分类(PaddlePaddle2.0)
  13. citus介绍和centos7安装部署和集群搭建
  14. Origin Pro 8.5 导出EPS格式稿件图片的设置
  15. TestBird《2021中国证券测试白皮书》
  16. 【C++】绘制一个登录窗口
  17. 单招报计算机要考什么,单招考试一般都考什么内容
  18. centos安装python3.8.1_centos6.6下安装python3.8.1后报错?
  19. Hadoop综合项目——二手房统计分析(可视化篇)
  20. Hammersley-Clifford定理证明

热门文章

  1. 吴恩达《序列模型》精炼笔记(2)-- NLP和Word Embeddings
  2. linux非交互式脚本,Linux expect非交互式执行脚本
  3. leetcode 打印_剑指 Offer 32 - III 从上到下打印二叉树 III - leetcode 剑指offer
  4. 面绘制经典算法:MarchingCube实现(控制台篇)
  5. 项目开发中的注意事项
  6. XCTF-Reverse:python-trade
  7. 为什么百度网盘显示2055G下载时却显示容量不足
  8. stm32 窗口看门狗学习(二)
  9. SpringMVC拦截器HandlerInterceptor原理及使用
  10. EasyExcel读取文件异常,报 java.lang.NoClassDefFoundError,/x2006/main/CTTableStyles