链接

点击跳转

题解

每条边能可以连、可以不连,其实就可以看作完全图每条边可以涂蓝色可以涂红色

那么这个题又变成了等价类计数问题

枚举边的置换的话,是不对的,因为直接枚举边的置换会导致本来有公共端点的边置换之后失去了公共顶点

直接枚举点的置换,就可以得到一个边的置换,而且是合法的所有边的合法置换都可以对应到一个点的置换

好,现在我枚举了一个点的置换

现在我们不是要使用burnsideburnsideburnside吗,那我就要求出一个点的置换对应的边置换的等价类数目(假设是m),然后把2m2^m2m加入答案。

怎么求呢?

边有两种,第一种是两个顶点都在同一个环内(我说的是置换里的环),可以发现对于一个大小为sss的环,这种等价类共有⌊s2⌋\lfloor \frac{s}{2} \rfloor⌊2s​⌋个(其实很好数,间隔为111的、间隔为222的、间隔为333的…间隔为⌊s2⌋\lfloor \frac{s}{2} \rfloor⌊2s​⌋的);然后再就两个端点分属两个环的边,假设第一个环大小为aaa,另一个大小为bbb,那么我先固定边的一头在第一个环的某个点,另一头在第二个环的某个点,然后开始“转”,每次每个换上的点“转”到下一个点,最后肯定会转回来,并且一共经过了lcm(a,b)lcm(a,b)lcm(a,b)个点,这是显而易见的,那么一共有ababab条边,我可以得到等价类的数目为ablcm(a,b)=gcd(a,b)\frac{ab}{lcm(a,b)} = gcd(a,b)lcm(a,b)ab​=gcd(a,b)

对所有的置换的2m2^m2m求和(mmm代表等价类数目),然后除以n!n!n!就是答案

但是我肯定不能枚举置换啊,那怎么办?其实很简单,枚举整数拆分,算出mmm,然后再用组合数学的知识算出这种拆分对应了多少种置换即可

这样的话好像最大数据还是要跑好几秒,但是一看NNN那么小,我直接打个表交上去不就完了

代码

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define iinf 0x3f3f3f3f
#define linf (1ll<<60)
#define eps 1e-8
#define maxn 300010
#define cl(x) memset(x,0,sizeof(x))
#define rep(i,a,b) for(i=a;i<=b;i++)
#define em(x) emplace(x)
#define emb(x) emplace_back(x)
#define emf(x) emplace_front(x)
#define fi first
#define se second
#define de(x) cerr<<#x<<" = "<<x<<endl
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
ll read(ll x=0)
{ll c, f(1);for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;for(;isdigit(c);c=getchar())x=x*10+c-0x30;return f*x;
}
#define mod 997ll
ll fact[maxn], _fact[maxn], pow2[maxn], inv[maxn], ans=0, N, v[maxn], tot;
void dfs(ll res, ll mn)
{ll i, j;if(res==0){ll cnt = fact[N], sum=0, t=0;// rep(i,1,tot)printf("%lld ",v[i]); putchar(10);rep(i,1,tot)(cnt*=inv[v[i]])%=mod;rep(i,1,tot){if(v[i]==v[i-1])t++;else{(cnt*=_fact[t])%=mod;t=1;}}(cnt*=_fact[t])%=mod;rep(i,1,tot)sum+=v[i]/2;rep(i,1,tot)rep(j,i+1,tot)sum+=__gcd(v[i],v[j]);(ans+=cnt*pow2[sum])%=mod;}rep(i,mn,res)v[++tot]=i, dfs(res-i,i), tot--;
}
int main()
{ll i;inv[1]=1;for(int i=2;i<maxn;i++)inv[i]=inv[mod%i]*(mod-mod/i)%mod;pow2[0]=fact[0]=_fact[0]=1;rep(i,1,maxn-1)fact[i]=fact[i-1]*i%mod, _fact[i]=_fact[i-1]*inv[i]%mod, pow2[i]=pow2[i-1]*2%mod;// N=read();// dfs(N,1);// (ans*=_fact[N])%=mod;// printf("%lld",ans);vector<int> lis({1, 2, 4, 11, 34, 156, 47, 382, 493, 291, 56, 400, 993, 778, 96, 890, 888, 766, 749, 7, 304, 785, 887, 46, 799, 403, 68, 742, 852, 567, 582, 803, 231, 122, 61, 761, 151, 931, 617, 870, 170, 736, 521, 412, 976, 217, 383, 119, 447, 314, 793, 952, 321, 665, 663, 780, 791, 78, 403, 683});cout<<lis[read()-1]<<endl;return 0;
}

nowcoder20072 [HNOI2009]图的同构相关推荐

  1. BZOJ1488: [HNOI2009]图的同构

    BZOJ1488: [HNOI2009]图的同构 Description 求两两互不同构的含n个点的简单图有多少种. 简单图是关联一对顶点的无向边不多于一条的不含自环的图. a图与b图被认为是同构的是 ...

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

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

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

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

  4. BZOJ 1488 [HNOI2009]图的同构 Polya定理

    题意:链接 方法: Polya定理 解析: 先扯点题外话. 小雨淅沥的下午,PoPoQQQ爷在屠了一道题后放松心情,恰看见我把知识点上的群论标记已会. 于是,为了发扬D人的精神,PoPoQQQ爷打开了 ...

  5. 《小学生都能看懂的群论从入门到升天教程》 《群论全家桶》

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 小学生都能看懂系列,小学生:我太难了   群论.置换.Bunrnside引理.Pόlya定理等概念是群 ...

  6. P3201 [HNOI2009]梦幻布丁 [启发式合并][set]

    P3201 [HNOI2009]梦幻布丁 题意:N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3 ...

  7. [HNOI2009]最小圈 (二分答案+负环)

    题面:[HNOI2009]最小圈 题目描述: 考虑带权的有向图\(G=(V,E)\)以及\(w:E\rightarrow R\),每条边\(e=(i,j)(i\neq j,i\in V,j\in V) ...

  8. 【BZOJ1485】[HNOI2009]有趣的数列(组合数学)

    [BZOJ1485][HNOI2009]有趣的数列(组合数学) 题面 BZOJ 洛谷 题解 从小往大填数,要么填在最小的奇数位置,要么填在最小的偶数位置. 偶数位置填的数的个数不能超过奇数位置填的数的 ...

  9. P4728 [HNOI2009]双递增序列

    链接P4728 [HNOI2009]双递增序列 设\(f_{i,j}\)表示当前考虑第\(i\)个数,上一步是\(a_{i-1}\)接在后面的序列一共取了\(j\)个数,另外一个序列的末尾最小值. 转 ...

  10. 「BZOJ1485」[HNOI2009] 有趣的数列 (卡特兰数列)

    「BZOJ1485」[HNOI2009] 有趣的数列   Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai ...

最新文章

  1. 一个高性能RPC框架原理剖析
  2. 微软的公开的DLL库
  3. ones--创建全1矩阵
  4. windows端口查看及进程查找
  5. Freebsd10.3(FreeBSD11 Beta1)使用手记
  6. Eclipse 安装Spring tool suite 解决官网下载jar文件无法安装/安装过程出错,及如何下载对应版本zip文件等问题,避坑
  7. python处理字符串效率_Python字符串搜索效率
  8. 如何让百度第一时间收录你的网站
  9. 在看世界杯的闲暇看看电视剧《长恨歌》
  10. C---蝉、蜻蜓、蜘蛛
  11. 你会感觉容器使用起来很痛苦吗?
  12. maven3.6.3 配置环境变量_JDK1.8简单配置环境变量---两步曲
  13. 张朝阳直播做饭上演“吃播”,“Charles的好物分享”探索带货形式新边界
  14. 从一个微型例子看“C/C++的内存分配机制”和“数组变量名与指针变量名”
  15. JavaScript 中 2个等号(==)和 3个等号(===)之间的区别
  16. 这样让你的采集内容变原创seo出来的伪原创
  17. webpack-theme-color-replacer自定义element-ui主题
  18. 常用矩阵向量求导公式
  19. 怎么制作书单视频?一款好用的制作软件教程
  20. LeetCode Count Complete Tree Nodes(二分法)

热门文章

  1. 各国/地区 语言缩写和国际域名缩写
  2. Word中标题段前设置了值却不显示的解决办法
  3. WhatsApp营销工具有哪些?
  4. jquery ajax 回调函数里面再执行ajax函数,jQuery AJAX 和其回调函数
  5. 微信公众号正式号网络授权域名操作
  6. Laravel 下使用 FFmpeg 处理多媒体文件
  7. 创建枚举类 java_Java枚举类
  8. html5图片高斯模糊,CSS实现图片高斯模糊但边界清楚的效果
  9. LM7805:电压调节器的工作原理
  10. 企业数据总线(ESB)和注册服务管理(dubbo)的区别{{1033}}