[BZOJ3456]城市规划

试题描述

刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了.

刚才说过, 阿狸的国家有 \(n\) 个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得整个国家的任意两个城市都直接或间接的连通. 为了省钱, 每两个城市之间最多只能有一条直接的贸易路径. 对于两个建立路线的方案, 如果存在一个城市对, 在两个方案中是否建立路线不一样, 那么这两个方案就是不同的, 否则就是相同的. 现在你需要求出一共有多少不同的方案.

好了, 这就是困扰阿狸的问题. 换句话说, 你需要求出 \(n\) 个点的简单(无重边无自环)无向连通图数目.

由于这个数字可能非常大, 你只需要输出方案数 \(\mod 1004535809(479 \times 2 ^ {21} + 1)\) 即可.

输入

仅一行一个整数 \(n(\le 130000)\)

输出

仅一行一个整数, 为方案数 \(\mod 1004535809\).

输入示例

3

输出示例

4

数据规模及约定

对于 \(100\%\) 的数据, \(n \le 130000\)

题解

令 \(f(n)\) 表示 \(n\) 个点的带标号简单无向连通图的个数,\(g(n)\) 表示 \(n\) 个点带标号简单无向图的个数,则显然有 \(g(n) = 2^{C_n^2}\)。

\(f(n)\) 的计算是一个经典的容斥,它等于无向图个数减去不连通的个数,不连通图的个数可以通过枚举“和节点 \(1\) 在同一个连通块的点数”来计算,具体地:

\[ f(n) = g(n) - \sum_{i=1}^{n-1} C_{n-1}^{i-1} \cdot f(i) \cdot g(n-i) \]

就是先确定哪 \(i-1\) 个点与 \(1\) 在同一个连通块中(组合数),然后连通部分的个数就是 \(f(i)\),剩下的部分随意连(即 \(g(n-i)\))。

把组合数展开得到

\[ f(n) = g(n) - \sum_{i=1}^{n-1} \frac{(n-1)!}{(i-1)!(n-i)!} \cdot f(i) \cdot g(n-i) \\ f(n) = (n-1)! \cdot \left[ \frac{g(n)}{(n-1)!} - \sum_{i=1}^{n-1} \frac{f(i)}{(i-1)!} \cdot \frac{g(n-i)}{(n-i)!} \right] \\ \frac{f(n)}{(n-1)!} = \frac{g(n)}{(n-1)!} - \sum_{i=1}^{n-1} \frac{f(i)}{(i-1)!} \cdot \frac{g(n-i)}{(n-i)!} \]

那么定义 \(F(x), G(x), G_1(x)\) 如下:

\[ F(x) = \sum_{i=1}^n \frac{f(i)}{(i-1)!} x^i \\ G(x) = \sum_{i=1}^n \frac{g(i)}{i!} x^i \\ G_1(x) = \sum_{i=1}^n \frac{g(i)}{(i-1)!} x^i \]

那么有

\[ F(x) = G_1(x) - F(x) \cdot G(x) \\ F(x) = \frac{G_1(x)}{G(x) + 1} \]

最后输出时不要忘了把 \((n-1)!\) 乘回来!

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
#define rep(i, s, t) for(int i = (s), mi = (t); i <= mi; i++)
#define dwn(i, s, t) for(int i = (s), mi = (t); i >= mi; i--)int read() {int x = 0, f = 1; char c = getchar();while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }return x * f;
}#define maxn 262144
#define MOD 1004535809
#define Groot 3
#define LL long longint Pow(int a, int b) {int ans = 1, t = a;while(b) {if(b & 1) ans = (LL)ans * t % MOD;t = (LL)t * t % MOD; b >>= 1;}return ans;
}
int _Pow(int a, LL b) {int ans = 1, t = a;while(b) {if(b & 1) ans = (LL)ans * t % MOD;t = (LL)t * t % MOD; b >>= 1;}return ans;
}int brev[maxn];
void FFT(int *a, int len, int tp) {int n = 1 << len;rep(i, 0, n - 1) if(i < brev[i]) swap(a[i], a[brev[i]]);rep(i, 1, len) {int wn = Pow(Groot, MOD - 1 >> i);if(tp < 0) wn = Pow(wn, MOD - 2);for(int j = 0; j < n; j += 1 << i) {int w = 1;rep(k, 0, (1 << i >> 1) - 1) {int la = a[j+k], ra = (LL)w * a[j+k+(1<<i>>1)] % MOD;a[j+k] = (la + ra) % MOD;a[j+k+(1<<i>>1)] = (la - ra + MOD) % MOD;w = (LL)w * wn % MOD;}}}if(tp < 0) {int invn = Pow(n, MOD - 2);rep(i, 0, n - 1) a[i] = (LL)a[i] * invn % MOD;}return ;
}void Mul(int *A, int *B, int n, int m, bool recover = 0) {int N = 1, len = 0;while(N <= n + m) N <<= 1, len++;rep(i, 0, N - 1) brev[i] = (brev[i>>1] >> 1) | ((i & 1) << len >> 1);FFT(A, len, 1); FFT(B, len, 1);rep(i, 0, N - 1) A[i] = (LL)A[i] * B[i] % MOD;FFT(A, len, -1); if(recover) FFT(B, len, -1);return ;
}int tmp[maxn];
void inverse(int *f, int *g, int n) {if(n == 1) return (void)(f[0] = Pow(g[0], MOD - 2));inverse(f, g, n + 1 >> 1);rep(i, 0, n - 1) tmp[i] = g[i];int N = 1, len = 0;while(N < (n << 1)) N <<= 1, len++;rep(i, 0, N - 1) brev[i] = (brev[i>>1] >> 1) | ((i & 1) << len >> 1);rep(i, n + 1 >> 1, N - 1) f[i] = 0;rep(i, n, N - 1) tmp[i] = 0;FFT(f, len, 1); FFT(tmp, len, 1);rep(i, 0, N - 1) f[i] = ((LL)f[i] * (2ll - (LL)tmp[i] * f[i] % MOD) % MOD + MOD) % MOD;FFT(f, len, -1);return ;
}int fac[maxn], ifac[maxn];
void init(int n) {ifac[1] = 1;rep(i, 2, n) ifac[i] = (LL)(MOD - MOD / i) * ifac[MOD%i] % MOD;fac[0] = ifac[0] = 1;rep(i, 1, n) fac[i] = (LL)fac[i-1] * i % MOD, ifac[i] = (LL)ifac[i-1] * ifac[i] % MOD;return ;
}LL C2(int n) { return (LL)n * (n - 1) >> 1; }int G[maxn], G1[maxn], iG[maxn];int main() {int n = read();init(n);rep(i, 1, n) {int t = _Pow(2, C2(i));G[i] = (LL)t * ifac[i] % MOD;G1[i] = (LL)t * ifac[i-1] % MOD;}G[0] = 1;inverse(iG, G, n + 1);Mul(G1, iG, n, n);printf("%lld\n", (LL)G1[n] * fac[n-1] % MOD);return 0;
}

转载于:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/8456318.html

[BZOJ3456]城市规划相关推荐

  1. bzoj3456: 城市规划

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

  2. 指数型生成函数[bzoj3456]城市规划

    前言 打完多项式板子后的第一题+清真的题意 题目相关 题目链接 题目大意 求nnn个点的简单(无重边无自环)无向连通图数目 输出模1004535809(479∗221+1)1004535809(479 ...

  3. 【多项式求逆】[BZOJ3456]城市规划

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

  4. bzoj3456:城市规划

    传送门 感觉这个题是真的神仙啊,思路是真的难想 首先设\(f(i)\)为\(i\)个点的无向连通图个数,然后设\(g(i)\)为\(i\)个点的图的个数(注意,此处不一定联通) 那么我们考虑枚举\(1 ...

  5. 【BZOJ-3456】城市规划 CDQ分治 + NTT

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=3456 Solution 这个问题可以考虑dp,利用补集思想 N个点的简单图总数量为$2^{ ...

  6. 【BZOJ3456】【CDQ分治+FNT】城市规划

    试题来源 2013中国国家集训队第二次作业 问题描述 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得 ...

  7. (每日一题)P4841 [集训队作业2013]城市规划 (无向连通图计数)(普通生成函数 + 多项式求逆)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.14 生成函数 + 多项式求逆 Pr ...

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

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

  9. 基于问题导向与成果产出的教学模式:《大数据与城市规划》特色课程

    [ 编者按 ]2015年12月,清华大学推出"大数据能力提升项目",旨在促进大数据人才培养,服务国家大数据发展战略.项目由清华-青岛数据科学研究院(以下简称:数据院)和研究生院共同 ...

最新文章

  1. 在Oracle VM VirtualBox中如何安装64位虚拟机系统
  2. 使用Redis 管理事务(Java)
  3. 疯狂android讲义(kotlin版) 源码 pan_每周一书《疯狂Python讲义》分享
  4. Android10.0 Binder通信原理(一)Binder、HwBinder、VndBinder概要
  5. 对于反射的一些总结(一)
  6. AUTOSAR从入门到精通100讲(四十七)-车载以太网 SOME/IP-SOME/IP的概念
  7. 智能营销增益模型(Uplift Modeling)的原理与实践
  8. 本周4天4场直播,解决你对Oracle的种种疑惑,还有第2期大咖讲坛讨论敏捷开发中的性能质量管控...
  9. Android进阶: 10分钟实现NDK-JNI 开发教程
  10. Mac安装homebrew,postman,charles,switchhost
  11. 倍福嵌入式控制器PLC各型号介绍
  12. 【论文阅读】VulCNN: An Image-inspired Scalable Vulnerability Detection System
  13. python下视频的包_Python——爬取包图网图片和视频
  14. 通过AT指令将air202 接入阿里云
  15. 自定义SeekBar 带文字
  16. ubuntu批量压缩文件夹
  17. winpe读取linux硬盘数据恢复,Acronis True Image的WinPE恢复媒体中有一个文件管理器,你知道吗?...
  18. 传奇列表获取失败与登录器太老怎么解决
  19. 使用adb和cmdline简化Android应用测试
  20. 利用信息差卖考研笔记,只要手机操作,一个月3000+你心动么?

热门文章

  1. Struts2标签库整理【完整】
  2. 海运业务常用缩略语 一
  3. GroovyHelp方便查看java api
  4. sip消息类型和消息代码详解-转
  5. 2019武汉大学计算机学院拟录取,武汉大学2019年招收攻读硕士研究生复试成绩拟录取名单...
  6. 修改项目图标_北京2022冬奥会和冬残奥会体育图标发布
  7. Python set模块使用方法
  8. myibatis 报错 Could not find result map java.util.HashMap
  9. Perl的Net::SSH::Perl模块实现远程登陆ssh
  10. web3j通过命令行工具新建钱包、更新钱包密码及转账