BZOJ 1488 Luogu P4727 [HNOI2009]图的同构 (群论、Burnside引理、组合计数)
题目链接
(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引理、组合计数)相关推荐
- BZOJ 1488 Luogu P4727 [HNOI2009]图的同构 (Burnside引理、组合计数)
题目链接 (Luogu) https://www.luogu.org/problem/P4727 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.ph ...
- BZOJ 2281 Luogu P2490 [SDOI2011]黑白棋 (博弈论、DP计数)
怎么SDOI2011和SDOI2019的两道题这么像啊..(虽然并不完全一样) 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?i ...
- Luogu P4708 画画 (Burnside引理、组合计数)
题目链接 https://www.luogu.org/problem/P4708 题解 看上去Luogu P4706-4709是Sdchr神仙出的一场比赛,一道水题和三道很有趣的题终于全过了纪念QAQ ...
- Luogu P4708 画画 (Burnside引理、组合计数、划分数)
题目链接 https://www.luogu.org/problem/P4708 题解 看上去Luogu P4706-4709是Sdchr神仙出的一场比赛,一道水题和三道很有趣的题终于全过了纪念QAQ ...
- Luogu P5564 [Celeste-B]Say Goodbye (多项式、FFT、Burnside引理、组合计数)
题目链接 https://www.luogu.org/problem/P5564 题解 这题最重要的一步是读明白题. 为了方便起见下面设环长可以是\(1\), 最后统计答案时去掉即可. 实际上就相当于 ...
- UOJ #219 BZOJ 4650 luogu P1117 [NOI2016]优秀的拆分 (后缀数组、ST表)
UOJ #219 BZOJ 4650 luogu P1117 [NOI2016]优秀的拆分 (后缀数组.ST表) 连NOI Day1T1都不会做...看了题解都写不出来还要抄Claris的代码.. 题 ...
- UOJ #131 BZOJ 4199 luogu P2178【NOI2015】品酒大会 (后缀自动机、树形DP)
UOJ #131 BZOJ 4199 luogu P2178[NOI2015]品酒大会 (后缀自动机.树形DP) 水是水,但是写出了不少问题,因此写一发博客. https://www.luogu.or ...
- BZOJ 1500 Luogu P2042 [NOI2005] 维护数列 (Splay)
BZOJ 1500 Luogu P2042 [NOI2005] 维护数列 (Splay) 手动博客搬家: 本文发表于20180825 00:34:49, 原地址https://blog.csdn.ne ...
- BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演)
BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演) 手动博客搬家:本文发表于20180310 11:46:11, 原地址https://blog.csdn.net/suncongbo/ ...
最新文章
- mysql 5.6 rpm 安装_mysql 5.6 rpm 包安装步骤需要注意的地方
- android studio 链接编辑,Android Studio怎么连接手机测试程序?
- PHP MySQLi/PDO_MySQL/PDO_SQLite CRUD(增查改删)
- PCB设计必知:布局及设计规范
- jquery in action 学习笔记
- Hanlp中自定义词典的配置、引用以及问题解决
- 【人工智能中“预测”的知识点】
- 【UOJ】【34】多项式乘法
- win10中VM15内centos7的安装
- CentOS Linux解决Device eth0 does not seem to be pres
- linux at命令关机,Linux at命令定时关机
- RNN(LSTMGRU)文本分类(PaddlePaddle2.0)
- citus介绍和centos7安装部署和集群搭建
- Origin Pro 8.5 导出EPS格式稿件图片的设置
- TestBird《2021中国证券测试白皮书》
- 【C++】绘制一个登录窗口
- 单招报计算机要考什么,单招考试一般都考什么内容
- centos安装python3.8.1_centos6.6下安装python3.8.1后报错?
- Hadoop综合项目——二手房统计分析(可视化篇)
- Hammersley-Clifford定理证明
热门文章
- 吴恩达《序列模型》精炼笔记(2)-- NLP和Word Embeddings
- linux非交互式脚本,Linux expect非交互式执行脚本
- leetcode 打印_剑指 Offer 32 - III 从上到下打印二叉树 III - leetcode 剑指offer
- 面绘制经典算法:MarchingCube实现(控制台篇)
- 项目开发中的注意事项
- XCTF-Reverse:python-trade
- 为什么百度网盘显示2055G下载时却显示容量不足
- stm32 窗口看门狗学习(二)
- SpringMVC拦截器HandlerInterceptor原理及使用
- EasyExcel读取文件异常,报 java.lang.NoClassDefFoundError,/x2006/main/CTTableStyles