【BZOJ-3456】城市规划 CDQ分治 + NTT
题目链接
http://www.lydsy.com/JudgeOnline/problem.php?id=3456
Solution
这个问题可以考虑dp,利用补集思想
N个点的简单图总数量为$2^{\binom{N}{2}}$,要求的是简单联通图,所以可以用总量减不连通的。
不连通的可以通过枚举与某个固定点的联通的点的数量得到$tot=\sum _{i=1} ^{N} \binom{N-1}{i-1}*dp[i]*2^{\binom{N-i}{2}}$
其中$dp[i]$表示的就是$i$个点的联通图数量。
然后将公式稍稍变型整理成$\frac{dp[N]}{(N-1)!}=\frac{2^{\binom{N}{2}}}{(N-1)!}-\sum_{i=1}^{N-1}\frac{dp[i]}{(i-1)!}*\frac{2^{\binom{N-i}{2}}}{(N-i)!}$
这个式子可以利用 CDQ分治+NTT 在$O(Nlog^{2}N)$的时间得到。
至于这道题吗,显然是可以多项式求逆来做的,复杂度$O(NlnN)$,上述做法自己写的被卡常了,不过本机效果还不错,留下代码以后看看。
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define LL long long#define P 1004535809LL
#define G 3LL#define MAXN 800010int N,len;inline LL Pow(LL x,LL y) {LL re=1; for (LL i=y; i; i>>=1,x=x*x%P) if (i&1) re=re*x%P; return re;}inline LL Inv(LL x) {return Pow(x,P-2);}int A[MAXN],B[MAXN],ans[MAXN],wn[31],dp[MAXN];inline void Rader(int *x)
{for (register int i=1,j=len>>1,k; i<len-1; i++) {if (i<j) swap(x[i],x[j]);k=len>>1;while (j>=k) j-=k,k>>=1;if (j<k) j+=k;}
}inline void DFT(int *x,int opt)
{Rader(x);for (register int h=2,id=0; h<=len; h<<=1) {LL Wn=wn[++id];for (register int i=0; i<len; i+=h) {LL W=1;for (register int j=i; j<i+h/2; j++) {LL u=(LL)x[j]%P,t=(LL)W*x[j+h/2]%P;x[j]=(u+t)%P; x[j+h/2]=(u-t+P)%P;W=W*Wn%P;}}}if (opt==-1) {for (register int i=1; i<len/2; i++) swap(x[i],x[len-i]);for (register int i=0; i<len; i++) x[i]=(LL)x[i]*Inv(len)%P;}
}inline void NTT()
{DFT(A,1); DFT(B,1);for (register int i=0; i<len; i++) ans[i]=(LL)A[i]*B[i]%P;DFT(ans,-1);
}int C2[MAXN],fac[MAXN],ifac[MAXN];inline void CDQ(int l,int r)
{if (l==r) {dp[l]=(C2[l]-(LL)dp[l]*fac[l-1]%P+P)%P; return;}int mid=(l+r)>>1;CDQ(l,mid);for (register int i=l; i<=mid; i++) A[i-l]=(LL)dp[i]*ifac[i-1]%P;for (register int i=0; i<=r-l; i++) B[i]=(LL)C2[i]*ifac[i]%P;for (register int i=mid-l+1; i<=r-l; i++) A[i]=0;len=1; while (len<((r-l+1)<<1)) len<<=1;for (register int i=r-l+1; i<len; i++) A[i]=B[i]=0;NTT();for (register int i=mid+1; i<=r; i++) (dp[i]+=ans[i-l])%=P;CDQ(mid+1,r);
}int main()
{
// freopen("count.in","r",stdin);
// freopen("count.out","w",stdout);scanf("%d",&N);for (register int i=0; i<=30; i++) wn[i]=Pow(G,(P-1)/(1<<i));fac[0]=ifac[0]=1;for (register int i=1; i<=N; i++) fac[i]=((LL)fac[i-1]*i)%P,ifac[i]=Inv(fac[i]);for (register int i=1; i<=N; i++) C2[i]=Pow(2LL,(LL)((LL)i*(i-1))/2);CDQ(1,N);printf("%d\n",dp[N]);return 0;
}
转载于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/6544454.html
【BZOJ-3456】城市规划 CDQ分治 + NTT相关推荐
- bzoj#3456. 城市规划
bzoj#3456. 城市规划 题目描述 Solution 用组合意义推很简单. iii个点的简单无向图个数为2(i2)2^{\tbinom{i}{2}}2(2i)个. 则其EGFEGFEGF为 G ...
- BZOJ 3456 城市规划 (组合计数、DP、FFT)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3456 著名的多项式练习题,做法也很多,终于切掉了纪念 首先求一波递推式: 令\(F(n ...
- BZOJ 4285 使者 (CDQ分治+dfs序)
题目传送门 题目大意:给你一棵树,有三种操作,在两个点之间连一个传送门,拆毁一个已有的传送门,询问两个点之间的合法路径数量.一条合法路径满足 1.经过且仅经过一个传送门 2.不经过起点终点简单路径上的 ...
- bzoj 4237: 稻草人 cdq分治
求有多少个点对 其一个点为左下角 一个点为右下角所形成的矩形内部没有点 每个x与y都不同 一开始的思路: 先按照x坐标排序 进行cdq分治 然后在cdq内对y进行排序 枚举mid+1-r的点作 ...
- Tsinsen A1493 城市规划(DP + CDQ分治 + NTT)
题目 Source http://www.tsinsen.com/A1493 Description 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在 ...
- bzoj 3456: 城市规划【NTT+多项式求逆】
参考:http://blog.miskcoo.com/2015/05/bzoj-3456 首先推出递推式(上面的blog讲的挺清楚的),大概过程是正难则反,设g为n个点的简单(无重边无自环)无向图数目 ...
- bzoj 1176 Mokia (cdq分治)
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MB Submit: 3874 Solved: 1742 [Submit] ...
- [bzoj] 1176 Mokia || CDQ分治
原题 给出W×W的矩阵(S没有用,题目有误),给出无限次操作,每次操作的含义为: 输入1:你需要把(x,y)(第x行第y列)的格子权值增加a 输入2:你需要求出以左下角为(x1,y1),右上角为(x2 ...
- BZOJ 3456: 城市规划 [多项式求逆元 DP]
题意: 求出n个点的简单(无重边无自环)无向连通图数目. 方案数mod 1004535809(479 * 2 ^ 21 + 1)即可. n<=130000 DP求方案 g(n) n个点所有图的方 ...
最新文章
- php5中魔术方法函数有哪几个,php中的类魔术方法有哪些
- d3.js 旋转图形_【IOS游戏推荐】百万畅销游戏刚从STEAM移植至IOS平台,在极端地形中冒险前进!——旋转轮胎:泥泞奔驰...
- # 定义四边形_数学教研——认识四边形
- Androidstudio如何正确导入和移出jar包
- JS判断当前的浏览器类型
- nodeJS的管道流和链式流
- 蓝图中实现人物移动1
- c语言接收并回现字符,C语言——字符I/O与缓冲区
- linux下ssh/sftp配置和权限设置
- 指定某个git的版本代码拉取新的分支
- 阿里云centos7上yum安装并连接mysql
- 用姿态补偿雷达数据畸变的文字想法
- csm redfish usb
- openGauss数据库备份与恢复
- Kinect-v2 Examples with MS-SDK Doc(Chinese documents)
- DM642的PCI驱动编程笔记:缺页中断问题阐述以及与改变中断级相关的内核函数
- 20181214-python-tips
- 字符编码(ASCII,Unicode和UTF-8) 和 大小端
- vim实用指南(一):光标移动(3)——滚动屏幕
- 阿里巴巴何以超越周期?| 一点财经
热门文章
- cygwin编译verilator_Windows 安装 verilator
- mysql 集群 增加服务器_MYSQL集群服务配置
- html产品列表页的设计,产品列表页.html
- linux mysql 无法识别,Linux下MySQL 5.7.23无法远程连接解决方案
- java增加final,Java8增加功能--Effectively final 功能
- tableau两个不同的图合并_Tableau可视化分析-业务常用图形绘制1
- html 可调节进度条控件,jQuery简单实用的轻量级进度条插件
- 布袋除尘器过滤风速多少_塑烧板除尘器过滤风速选多少
- linux应用程序跑飞,linux 试题
- python中 str 和 repr_python repr()与str()区别总结