bzoj-1488 图的同构
题意:
求n个点,无重边无自环,本质不同的无向图的个数;
本质不同指将两个图任意重新标号之后两个图不相同;
n<=60;
题解:
首先这是一道置换计数的题目;
我们应用polya定理解决这道题;
考虑每条边选或不选,这就是两种颜色;
那么就是求每种置换方式的边循环个数;
置换方式就是对于点的重标号,这是有n!种的啊;
然而这n!中有一些情况的答案是一样的,因为其实答案只和点循环中点的个数有关;
比如(1)(2,3)和(1,2)(3)就是一样的,都是1,2这样的划分方法;
那么对于一种划分方法来说,边循环个数怎么求呢?
一种划分中有两种边,划分在一起的边和不在一起的边;
在一起的边有floor(块大小/2)种边循环,不在一起的有gcd(块1大小,块2大小)种;
统计起来做2的幂次,然后在乘这种划分的个数;
至于划分的个数是多少。。我召唤一下wzq
现在对于我们枚举出来的一个点循环集l1,l2...lm来说,有多少个这个点循环集呢?
有N!|l1|∗|l2|∗...∗|lm|
但是注意到,我们枚举出来的点循环集可能有大小相等的。
所以我们还得除掉大小相等的点循环集的个数的排列。
至于如上为什么是这样,您要是不知道的话,那请听一听排列组合吧。
于是对应的这个点循环搞出来的如此的边循环集个数是多少呢N!|l1|∗|l2|∗...∗|lm|∗|S1!|∗|S2!|∗...∗|Sq!|
这个粘的不太好别在意= = ;
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 64
#define mod 997
using namespace std;
int n,ans;
int a[N],fact[N],inv[mod];
int pow(int x,int y)
{int ret=1;while(y){if(y&1)ret=ret*x%mod;x=x*x%mod;y>>=1;}return ret;
}
int gcd(int a,int b)
{int t=a%b;while(t){a=b,b=t;t=a%b;}return b;
}
void calc(int tot)
{int ret=0,last=0,cnt=0;for(int i=1;i<=tot;i++){ret+=a[i]>>1;for(int j=1;j<i;j++){ret+=gcd(a[i],a[j]);}}ret=pow(2,ret);ret=ret*fact[n]%mod;for(int i=1;i<=tot;i++){ret=ret*inv[a[i]]%mod;if(a[i]!=last){ret=ret*inv[fact[cnt]]%mod;last=a[i];cnt=0;}cnt++;}ret=ret*inv[fact[cnt]]%mod;ans=(ans+ret)%mod;
}
void dfs(int d,int last,int now)
{if(n==now){calc(d-1);return ;}for(int i=last;i<=n-now;i++){a[d]=i;dfs(d+1,i,now+i);}
}
void init()
{fact[0]=1;for(int i=1;i<N;i++)fact[i]=fact[i-1]*i%mod;for(int i=1;i<mod;i++)inv[i]=pow(i,mod-2);
}
int main()
{init();scanf("%d",&n);dfs(1,1,0);ans=ans*inv[fact[n]]%mod;printf("%d",ans);return 0;
}
bzoj-1488 图的同构相关推荐
- 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 ...
- BZOJ 1488 [HNOI2009]图的同构 Polya定理
题意:链接 方法: Polya定理 解析: 先扯点题外话. 小雨淅沥的下午,PoPoQQQ爷在屠了一道题后放松心情,恰看见我把知识点上的群论标记已会. 于是,为了发扬D人的精神,PoPoQQQ爷打开了 ...
- 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 ...
- BZOJ.1558.[JSOI2009]等差数列(线段树 差分)
BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...
- S-T平面图中利用最短路求最小割(BZOJ 1001)
BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...
- BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)
题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...
- BZOJ 2957楼房重建
传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...
- BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)
BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...
最新文章
- IOS-多线程(NSOperation)
- 让运维人崩溃的10大瞬间
- 初识github之注册和基本概念
- shell 获取 mysql 行数_一个Shell小脚本精准统计Mysql每张表的行数实现
- 为什么redis取出来是null_[2020] Redis 最新面试题
- lisp医院化验系统_浅谈医院化验室信息系统(LIS)的建设
- 微课|中学生可以这样学Python(例4.2):打印九九乘法表
- 在Windows 7 (SP1)上安装Visual Studio 2015
- java输入验证码代码,JavaWeb 实现验证码功能(demo)
- oracle 开启事务_javaSE第十四部分 JDBC(2)mysql事务和JDBC实现事务
- nginx websocket 代理
- npm:no such file /usr/local/lib/node_modules/vue-cli/node_modules/get-stream
- http://www.feedsky.com/help_publishwidget.html
- 安装完固态硬盘后计算机里没显示,安装了双硬盘电脑却不显示新硬盘怎么办
- php百度网盘登录,php登陆状态百度网盘获取文件下载链接【思路|部分代码】
- CodeFun-UI 设计稿智能生成前端源代码
- 进行小红书营销,怎样拉入更多的客户?
- 数组中a与a[0]的区别
- 浙江工商大学20机试(oj复试)月利率
- php搭建markdown云笔记_Typora+坚果云:支持markdown的云笔记搭建