[BZOJ1488][HNOI2009]图的同构(dfs+置换群+数论+组合数学)
题目描述
传送门
题解
在完全图中选出一个简单图
相当于是将所有的边染成两种颜色
其余的就和BZOJ1815一样了
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define Mod 997
#define N 65int n,now,ans,dvd;
int a[N],b[N],mul[N],inv[N],t[N][N],mi[1800],f[N],c[N][N];int gcd(int a,int b)
{
if (!b) return a;
else return gcd(b,a%b);
}
int fast_pow(int a,int p)
{
int ans=1;
for (;p;p>>=1,a=a*a%Mod)
if (p&1)
ans=ans*a%Mod;
return ans;
}
void calc()
{
mul[0]=1;for (int i=1;i<=n;++i) mul[i]=mul[i-1]*i%Mod;
mi[0]=1;for (int i=1;i<=n*(n-1)/2;++i) mi[i]=mi[i-1]*2%Mod;
for (int i=1;i<=n;++i)
for (int j=i;j<=n;++j) t[i][j]=gcd(i,j);
for (int i=1;i<=n;++i) inv[i]=fast_pow(mul[i],Mod-2);
for (int i=0;i<=n;++i) c[i][0]=1;
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
c[i][j]=(c[i-1][j]+c[i-1][j-1])%Mod;
}
void dfs(int dep)
{
if (!dep)
{ int sum=0;
for (int i=1;i<=now;++i)
for (int j=i+1;j<=now;++j)
sum+=t[a[i]][a[j]];
for (int i=1;i<=now;++i) sum+=a[i]/2; int cnt=n,tot=1;
for (int i=1;i<now;++i)
{ tot=tot*c[cnt][a[i]]%Mod;
cnt-=a[i];
}
for (int i=1;i<=n;++i)
if (b[i])
tot=tot*inv[b[i]]%Mod;
for (int i=1;i<=now;++i)
tot=tot*mul[a[i]-1]%Mod; ans=(ans+tot*mi[sum])%Mod;
return;
}
for (int i=a[now];i<=dep;++i)
{ a[++now]=i;
++b[a[now]];
dfs(dep-i);
--b[a[now]];
--now;
}
}
int main()
{
scanf("%d",&n);calc();
now=0;a[0]=1;dfs(n);
ans=ans*fast_pow(mul[n],Mod-2)%Mod;
printf("%d\n",ans);
}
[BZOJ1488][HNOI2009]图的同构(dfs+置换群+数论+组合数学)相关推荐
- BZOJ1488: [HNOI2009]图的同构
BZOJ1488: [HNOI2009]图的同构 Description 求两两互不同构的含n个点的简单图有多少种. 简单图是关联一对顶点的无向边不多于一条的不含自环的图. a图与b图被认为是同构的是 ...
- 【BZOJ1485】[HNOI2009]有趣的数列(组合数学)
[BZOJ1485][HNOI2009]有趣的数列(组合数学) 题面 BZOJ 洛谷 题解 从小往大填数,要么填在最小的奇数位置,要么填在最小的偶数位置. 偶数位置填的数的个数不能超过奇数位置填的数的 ...
- BZOJ 1488 Luogu P4727 [HNOI2009]图的同构 (群论、Burnside引理、组合计数)
题目链接 (Luogu) https://www.luogu.org/problem/P4727 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.ph ...
- BZOJ 1488 Luogu P4727 [HNOI2009]图的同构 (Burnside引理、组合计数)
题目链接 (Luogu) https://www.luogu.org/problem/P4727 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.ph ...
- 算法基础 - 数论 | 组合数学 卡特兰数(Catalan number)定义、证明及例题
写在前面:卡特兰数这东西感觉挺常用的,并且公式很简单,那就花一下午总结一下,学点皮毛吧(反正遇到我还是不会 ) [PDF] 大三上组合数学课堂讲义 文章目录 卡特兰数定义 卡特兰数的性质 卡特兰数证明 ...
- BZOJ 1488 [HNOI2009]图的同构 Polya定理
题意:链接 方法: Polya定理 解析: 先扯点题外话. 小雨淅沥的下午,PoPoQQQ爷在屠了一道题后放松心情,恰看见我把知识点上的群论标记已会. 于是,为了发扬D人的精神,PoPoQQQ爷打开了 ...
- 0x35.数论 - 组合数学与计数
目录 一.计数原理 1.加法原理 2.乘法原理 3.减法原理 二.排列组合 1.排列数 2.组合数 3.数学题 三.组合数的计算 1. 加法递推O(n2)O(n^2)O(n2) 2. 乘法递推O(n) ...
- Codeforces Round #450 (Div. 2)D. Unusual Sequences[数论][组合数学][dp II]
题目:http://codeforces.com/contest/900/problem/D 题意:找到加和为m的且gcd为n的数列种类数 分析:可以转化为求gcd为1的加和为m/n的种类数,假设有m ...
- P2638-安全系统【数论,组合数学】
正题 题目链接:https://www.luogu.org/problem/P2638 题目大意 aaa个不同的000,bbb个不同的111.nnn个位置每个可以放0,10,10,1可以都放也可以不放 ...
- P4562-[JXOI2018]游戏【数论,组合数学】
正题 题目链接:https://www.luogu.org/problemnew/show/P4562 题目大意 l∼rl\sim rl∼r的变化,每次访问第iii个那么iii的倍数就不用访问了.对于 ...
最新文章
- 基于redis的cas集群配置(转)
- Java判断文件类型
- 未处理的异常:进程性能计数器已禁用
- mysql utf8跟utf8mb4_MySQL utf8 和 utf8mb4 的区别
- TowlHub,它不是一个简单的纸巾架
- python怎么用for循环找出最大值_在for循环Python中查找前10个最大值
- Bear in the Field(CF-385E)
- Java基础学习总结(105)——让 Java 开发更简单,提高工作效率!
- 任务管理器中arcsom.exe和arcsoc.exe的个数问题
- 这些话,是乔布斯给世间留下的真正伟大礼物
- MATLAB对数坐标图和统计图(semilogy/loglog)
- 前端HTML、CSS学习完整笔记(中下篇)
- 在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 7939(unattended-upgr)持有... 32秒
- 十人面试就我通过,只因我答对了这题TCP协议为什么需要三次握手
- DateTime日期差
- ICH10R服务器主板是什么芯片,主板上面都有啥?常见板载芯片功能介绍(一)
- 网易云课堂Linux运维在线班英文单词笔记
- 作为一个研发背景出身的项目经理写给IT面试者的几点建议
- 蓝海创意云丨刺杀小说家:中国第一部大规模用虚拟拍摄的真人电影
- Windows保护模式(五)任务段任务门