\(n\)个点的无向联通图的个数


打着好累啊

一定要封装一个板子


记\(C(x)\)为无向图个数的指数型生成函数,\(C(0) = 1\)

记\(G(x)\)为无向联通图个数的指数型生成函数,\(G(0) = 0\)

那么\(G(x) = e^{C(x)}\)

从而,\(C(x) = In(G(x))\)

复杂度\(O(n \log n)\)


  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6. #define ri register int
  7. #define rep(io, st, ed) for(ri io = st; io <= ed; io ++)
  8. #define drep(io, ed, st) for(ri io = ed; io >= st; io --)
  9. const int sid = 270000;
  10. const int mod = 1004535809;
  11. inline int Inc(int a, int b) { return (a + b >= mod) ? a + b - mod : a + b; }
  12. inline int Dec(int a, int b) { return (a - b < 0) ? a - b + mod : a - b; }
  13. inline int mul(int a, int b) { return 1ll * a * b % mod; }
  14. inline int fp(int a, int k) {
  15. int ret = 1;
  16. for( ; k; k >>= 1, a = mul(a, a))
  17. if(k & 1) ret = mul(ret, a);
  18. return ret;
  19. }
  20. int N_, N, n, lg;
  21. int ans[sid], ivfac[sid], fac[sid], inv[sid], rev[sid];
  22. inline void init(int Maxn, int &rn, int &rlg, int opt = 0) {
  23. rn = 1; rlg = 0;
  24. while(rn < Maxn) rn <<= 1, rlg ++;
  25. if(opt) rep(i, 0, rn) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (rlg - 1));
  26. }
  27. inline int NTT(int *a, int n, int opt) {
  28. for(ri i = 0; i < n; i ++)
  29. if(i < rev[i]) swap(a[i], a[rev[i]]);
  30. for(ri i = 1; i < n; i <<= 1)
  31. for(ri j = 0, g = fp(3, (mod - 1) / (i << 1)); j < n; j += (i << 1))
  32. for(ri k = j, G = 1; k < i + j; k ++, G = 1ll * G * g % mod) {
  33. int x = a[k], y = mul(G, a[i + k]);
  34. a[k] = (x + y >= mod) ? x + y - mod : x + y;
  35. a[i + k] = (x - y < 0) ? x - y + mod : x - y;
  36. }
  37. if(opt == -1) {
  38. reverse(a + 1, a + n);
  39. for(ri i = 0; i < n; i ++) a[i] = mul(a[i], inv[n]);
  40. }
  41. }
  42. int iva[sid], ivb[sid];
  43. inline void get_inv(int *a, int n, int *ret) {
  44. if(n == 1) { ret[0] = inv[a[0]]; return; }
  45. get_inv(a, n >> 1, ret);
  46. init(n + n, N, lg, 1);
  47. for(ri i = 0; i < N; i ++) iva[i] = ivb[i] = 0;
  48. for(ri i = 0; i < n; i ++) iva[i] = a[i], ivb[i] = ret[i];
  49. NTT(iva, N, 1); NTT(ivb, N, 1);
  50. for(ri i = 0; i < N; i ++) iva[i] = Dec(Inc(ivb[i], ivb[i]), mul(iva[i], mul(ivb[i], ivb[i])));
  51. NTT(iva, N, -1);
  52. for(ri i = 0; i < n; i ++) ret[i] = iva[i];
  53. }
  54. inline void wf(int *a, int n, int *ret) { for(ri i = 1; i < n; i ++) ret[i - 1] = mul(a[i], i); }
  55. inline void jf(int *a, int n, int *ret) { for(ri i = 1; i < n; i ++) ret[i] = mul(a[i - 1], inv[i]); }
  56. int ivf[sid], df[sid];
  57. inline void get_ln(int *a, int n, int *ret) {
  58. int N = 1, lg = 0;
  59. init(n + n, N, lg);
  60. wf(a, n, df); get_inv(a, n, ivf);
  61. init(n + n, N, lg, 1);
  62. NTT(df, N, 1); NTT(ivf, N, 1);
  63. for(ri i = 0; i < N; i ++) df[i] = mul(df[i], ivf[i]);
  64. NTT(df, N, -1); jf(df, n, ret);
  65. }
  66. int C2[sid], f[sid];
  67. int main() {
  68. freopen("3456.in", "r", stdin);
  69. freopen("3456.out", "w", stdout);
  70. cin >> n;
  71. init(n + 5, N_, lg);
  72. N_ <<= 1;
  73. inv[0] = inv[1] = 1;
  74. fac[0] = fac[1] = 1;
  75. ivfac[0] = ivfac[1] = 1;
  76. rep(i, 2, N_) {
  77. fac[i] = mul(fac[i - 1], i);
  78. inv[i] = mul(inv[mod % i], mod - mod / i);
  79. }
  80. rep(i, 2, N_) ivfac[i] = mul(inv[i], ivfac[i - 1]);
  81. rep(i, 0, N_) C2[i] = 1ll * i * (i - 1) / 2 % (mod - 1);
  82. rep(i, 0, N_) f[i] = mul(fp(2, C2[i]), ivfac[i]);
  83. N_ >>= 1;
  84. get_ln(f, N_, ans);
  85. printf("%d\n", mul(ans[n], fac[n]));
  86. return 0;
  87. }

bzoj3456 城市规划 多项式求In的更多相关文章

  1. 【BZOJ3456】城市规划 多项式求逆

    [BZOJ3456]城市规划 Description 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得 ...

  2. BZOJ 3456: 城市规划 [多项式求逆元 组合数学 | 生成函数 多项式求ln]

    3456: 城市规划 题意:n个点组成的无向连通图个数 以前做过,今天复习一下 令\(f[n]\)为n个点的无向连通图个数 n个点的完全图个数为\(2^{\binom{n}{2}}\) 和Bell数的 ...

  3. BZOJ 3456: 城市规划 [多项式求逆元 DP]

    题意: 求出n个点的简单(无重边无自环)无向连通图数目.方案数mod 1004535809(479 * 2 ^ 21 + 1)即可. n<=130000 DP求方案 g(n) n个点所有图的方案 ...

  4. BZOJ 3456: 城市规划 多项式求逆

    Description 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了.  刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得整个国家的任意两个城市都直接 ...

  5. bzoj 3456 城市规划 多项式求逆+分治FFT

    城市规划 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1091  Solved: 629[Submit][Status][Discuss] Desc ...

  6. bzoj3456城市规划 多项式取模

    題目大意 求出有n个点的有标号简单连通无向图的数目. 题解 什么破玩意,直接输出\(2^{C_n^2}\)走人 我们发现这张图要求连通,而上式肯定不能保证连通. 其实上式表示的是不保证连通的有标号简单 ...

  7. [BZOJ3456]城市规划(生成函数+多项式求逆+多项式求ln)

    城市规划 时间限制:40s      空间限制:256MB 题目描述 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了.  刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一 ...

  8. 【BZOJ3456】轩辕朗的城市规划 无向连通图计数 CDQ分治 FFT 多项式求逆 多项式ln

    题解 分治FFT 设\(f_i\)为\(i\)个点组成的无向图个数,\(g_i\)为\(i\)个点组成的无向连通图个数 经过简单的推导(枚举\(1\)所在的连通块大小),有: \[ f_i=2^{\f ...

  9. 【bzoj3456】城市规划(多项式求逆+dp)

    Description 求\(~n~\)个点组成的有标号无向连通图的个数.\(~1 \leq n \leq 13 \times 10 ^ 4~\). Solution 这道题的弱化版是poj1737, ...

随机推荐

  1. 未来人类T5 安装win10,ubuntu双系统

    1.首先确保win10已经安装,u盘中已刻录好系统,下载好英伟达最新驱动保存在u盘中,压缩100g的磁盘空间给ubuntu. 2.设置双显卡模式,重启时按F7选择进入u盘启动. 3.进入安装界面,选择 ...

  2. 工具推荐:ATSCAN,功能强大的Perl脚本扫描器

    工具推荐:ATSCAN,功能强大的Perl脚本扫描器 使用perl语言编写的开源的扫描器,功能丰富强大,除了基本的tcp和udp端口扫描之外,还可以搜索wordpress.joomla等网站并进行口令 ...

  3. 使用httpClient调用接口,参数用map封装或者使用JSON参数,并转换返回结果

    这里接口用表存起来,标记请求方式,然后接受参数,消息或者请求参数都可以, 然后先是遍历需要调用的接口,封装参数,再分别调用get与post即可,没有微服务还是得自己写 //消息转发-获取参数中对应参数 ...

  4. 加密文件之Java改进版

    对应Python版:加密文件之Python版Java版比Python版要快得多,两个版本不在一个量级上.在加密解密1G大文件时,Java版花费的时间是秒级,而Python版花费的时间是10分钟级. i ...

  5. 嵌入式linux/android alsa_aplay alsa_amixer命令行用法

    几天在嵌入式linux上用到alsa command,网上查的资料多不给力,只有动手一点点查,终于可以用了,将这个使用方法告诉大家,以免大家少走弯路. 0.先查看系统支持哪几个alsa cmd: ll ...

  6. unity 代码有调整,重新导出 iOS 最烦的就是 覆盖导出后项目不能打开

    unity  代码有调整,重新导出 iOS 最烦的就是 覆盖导出后项目不能打开,原因是 editor 里面的脚本,破坏了 Unity-iPhone.xcodeproj 里面的结构,具体是什么原因,也不 ...

  7. Python开发环境(1):Eclipse+PyDev插件

    电脑:小米笔记本电脑Pro 15.6寸(i5-8250U),操作系统:Windows 10,JDK版本:1.8.0_152(环境变量已配置) Step 1.下载Eclipse 根据我的CPU型号,选择 ...

  8. python 常用的标准库及第三方库

    标准库Python拥有一个强大的标准库.Python语言的核心只包含数字.字符串.列表.字典.文件等常见类型和函数,而由Python标准库提供了系统管理.网络通信.文本处理.数据库接口.图形系统.XM ...

  9. SCTF 2015 pwn试题分析

    Re1 是一个简单的字符串加密.程序使用了多个线程,然后进行同步.等加密线程加密好了之后才会启动验证线程.这个题比较坑的是IDA F5出来的结果不对,不知道是不是混淆机制. 刚开始看的是F5后的伪代码 ...

  10. Android Studio3.x新的依赖方式(implementation、api、compileOnly)

    https://blog.csdn.net/yuzhiqiang_1993/article/details/78366985?locationNum=6&fps=1 Android Studi ...