题目链接

  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相关推荐

  1. bzoj#3456. 城市规划

    bzoj#3456. 城市规划 题目描述 Solution 用组合意义推很简单. iii个点的简单无向图个数为2(i2)2^{\tbinom{i}{2}}2(2i​)个. 则其EGFEGFEGF为 G ...

  2. BZOJ 3456 城市规划 (组合计数、DP、FFT)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3456 著名的多项式练习题,做法也很多,终于切掉了纪念 首先求一波递推式: 令\(F(n ...

  3. BZOJ 4285 使者 (CDQ分治+dfs序)

    题目传送门 题目大意:给你一棵树,有三种操作,在两个点之间连一个传送门,拆毁一个已有的传送门,询问两个点之间的合法路径数量.一条合法路径满足 1.经过且仅经过一个传送门 2.不经过起点终点简单路径上的 ...

  4. bzoj 4237: 稻草人 cdq分治

    求有多少个点对  其一个点为左下角  一个点为右下角所形成的矩形内部没有点 每个x与y都不同 一开始的思路: 先按照x坐标排序  进行cdq分治 然后在cdq内对y进行排序  枚举mid+1-r的点作 ...

  5. Tsinsen A1493 城市规划(DP + CDQ分治 + NTT)

    题目 Source http://www.tsinsen.com/A1493 Description 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在 ...

  6. bzoj 3456: 城市规划【NTT+多项式求逆】

    参考:http://blog.miskcoo.com/2015/05/bzoj-3456 首先推出递推式(上面的blog讲的挺清楚的),大概过程是正难则反,设g为n个点的简单(无重边无自环)无向图数目 ...

  7. bzoj 1176 Mokia (cdq分治)

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MB Submit: 3874  Solved: 1742 [Submit] ...

  8. [bzoj] 1176 Mokia || CDQ分治

    原题 给出W×W的矩阵(S没有用,题目有误),给出无限次操作,每次操作的含义为: 输入1:你需要把(x,y)(第x行第y列)的格子权值增加a 输入2:你需要求出以左下角为(x1,y1),右上角为(x2 ...

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

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

最新文章

  1. php5中魔术方法函数有哪几个,php中的类魔术方法有哪些
  2. d3.js 旋转图形_【IOS游戏推荐】百万畅销游戏刚从STEAM移植至IOS平台,在极端地形中冒险前进!——旋转轮胎:泥泞奔驰...
  3. # 定义四边形_数学教研——认识四边形
  4. Androidstudio如何正确导入和移出jar包
  5. JS判断当前的浏览器类型
  6. nodeJS的管道流和链式流
  7. 蓝图中实现人物移动1
  8. c语言接收并回现字符,C语言——字符I/O与缓冲区
  9. linux下ssh/sftp配置和权限设置
  10. 指定某个git的版本代码拉取新的分支
  11. 阿里云centos7上yum安装并连接mysql
  12. 用姿态补偿雷达数据畸变的文字想法
  13. csm redfish usb
  14. openGauss数据库备份与恢复
  15. Kinect-v2 Examples with MS-SDK Doc(Chinese documents)
  16. DM642的PCI驱动编程笔记:缺页中断问题阐述以及与改变中断级相关的内核函数
  17. 20181214-python-tips
  18. 字符编码(ASCII,Unicode和UTF-8) 和 大小端
  19. vim实用指南(一):光标移动(3)——滚动屏幕
  20. 阿里巴巴何以超越周期?| 一点财经

热门文章

  1. cygwin编译verilator_Windows 安装 verilator
  2. mysql 集群 增加服务器_MYSQL集群服务配置
  3. html产品列表页的设计,产品列表页.html
  4. linux mysql 无法识别,Linux下MySQL 5.7.23无法远程连接解决方案
  5. java增加final,Java8增加功能--Effectively final 功能
  6. tableau两个不同的图合并_Tableau可视化分析-业务常用图形绘制1
  7. html 可调节进度条控件,jQuery简单实用的轻量级进度条插件
  8. 布袋除尘器过滤风速多少_塑烧板除尘器过滤风速选多少
  9. linux应用程序跑飞,linux 试题
  10. python中 str 和 repr_python repr()与str()区别总结