【BZOJ3456】轩辕朗的城市规划 EGF+多项式求ln
我们构造$f(i)$和$g(i)$。
其中$f(x)$表示由$x$个节点构成的无向简单连通图的个数。
$g(x)$表示有$x$个节点构成的无向简单图(不要求连通)的个数。
显然,由$x$个节点构成的无向简单图最多能有$\binom{x}{2}$条边,那么$g(x)=2^{\binom{x}{2}}$。
然后我们构造$f(x)$和$g(x)$的$EGF$:
$F(x)=\sum_{i=0}^{\infty} f(i) \times \frac{x^i}{i!}$。
$G(x)=\sum_{i=0}^{\infty} g(i) \times \frac{x^i}{i!}\ =\sum_{i=0}^{\infty} 2^{\binom{x}{2}} \times \frac{x^i}{i!}$。
然后我们又不难发现,$G(x)=\sum_{i=0}^{\infty} \frac{F(x)^i}{i!}$。(这个式子可以这样理解:图中包含$1$个联通块的生成函数为$F(x)$,包含$2$个连通块的生成函数为$\frac{1}{2}F^2(x)$,包含$3$个连通块的生成函数为$\frac{1}{3!} F^3(x)$,以此类推)
考虑到$e^x$的泰勒展开式为$\sum_{i=0}^{\infty} \frac{x^i}{i!}$,则 $G(x)=e^{F(x)}$。
由于多项式$G(x)$我们已经求得,则$F(x)=ln(G(x))$。
则答案为$[x^n]F(n) \times n!$。
考虑到多项式求ln的时间复杂度为O(n long n),则该算法的时间复杂度为O(n log n)。
- #include<bits/stdc++.h>
- #define M (1<<19)
- #define L long long
- #define G 3
- #define MOD 1004535809
- using namespace std;
- L pow_mod(L x,L k){
- L ans=;
- while(k){
- if(k&) ans=ans*x%MOD;
- x=x*x%MOD; k>>=;
- }
- return ans;
- }
- void change(L a[],int n){
- for(int i=,j=;i<n-;i++){
- if(i<j) swap(a[i],a[j]);
- int k=n>>;
- while(j>=k) j-=k,k>>=;
- j+=k;
- }
- }
- void NTT(L a[],int n,int on){
- change(a,n);
- for(int h=;h<=n;h<<=){
- L wn=pow_mod(G,(MOD-)/h);
- for(int j=;j<n;j+=h){
- L w=;
- for(int k=j;k<j+(h>>);k++){
- L u=a[k],t=a[k+(h>>)]*w%MOD;
- a[k]=(u+t)%MOD;
- a[k+(h>>)]=(u-t+MOD)%MOD;
- w=w*wn%MOD;
- }
- }
- }
- if(on==-){
- L inv=pow_mod(n,MOD-);
- for(int i=;i<n;i++) a[i]=a[i]*inv%MOD;
- reverse(a+,a+n);
- }
- }
- void getinv(L a[],L b[],int n){
- if(n==){b[]=pow_mod(a[],MOD-); return;}
- static L c[M],d[M];
- memset(c,,M<<); memset(d,,M<<);
- getinv(a,c,n>>);
- for(int i=;i<n;i++) d[i]=a[i];
- NTT(d,n<<,); NTT(c,n<<,);
- for(int i=;i<(n<<);i++) b[i]=(*c[i]-d[i]*c[i]%MOD*c[i]%MOD+MOD)%MOD;
- NTT(b,n<<,-);
- for(int i=;i<n;i++) b[i+n]=;
- }
- void qiudao(L a[],L b[],int n){
- for(int i=;i<n;i++) b[i-]=a[i]*i%MOD;
- }
- void jifen(L a[],L b[],int n){
- for(int i=;i<n;i++) b[i+]=a[i]*pow_mod(i+,MOD-)%MOD;
- }
- void getln(L a[],L b[],int n){
- static L inva[M],pia[M];
- memset(inva,,M<<); memset(pia,,M<<);
- getinv(a,pia,n); qiudao(a,inva,n);
- NTT(pia,n<<,); NTT(inva,n<<,);
- for(int i=;i<(n<<);i++) pia[i]=pia[i]*inva[i]%MOD;
- NTT(pia,n<<,-);
- jifen(pia,b,n);
- }
- L a[M]={},f[M]={};
- L fac[M]={},invfac[M]={};
- int main(){
- fac[]=;
- int n; scanf("%d",&n);
- int nn=; while(nn<=n) nn<<=;
- for(int i=;i<nn;i++) fac[i]=fac[i-]*i%MOD;
- invfac[nn-]=pow_mod(fac[nn-],MOD-);
- for(int i=nn-;~i;i--) invfac[i]=invfac[i+]*(i+)%MOD;
- for(L i=;i<nn;i++) a[i]=pow_mod(,i*(i-)/)*invfac[i]%MOD;
- getln(a,f,nn);
- printf("%lld\n",f[n]*fac[n]%MOD);
- }
【BZOJ3456】轩辕朗的城市规划 EGF+多项式求ln的更多相关文章
- BZOJ3456 城市规划 【多项式求ln】
题目链接 BZOJ3456 题解 真是一道经典好题,至此已经写了分治\(NTT\),多项式求逆,多项式求\(ln\)三种写法 我们发现我们要求的是大小为\(n\)无向联通图的数量 而\(n\)个点的无 ...
- 【BZOJ】3456: 城市规划(多项式求ln)
题解 在我写过分治NTT,多项式求逆之后 我又一次写了多项式求ln 我们定义一个数列的指数型生成函数为 \(\sum_{i = 0}^{n} \frac{A_{i}}{i!} x^{i}\) 然后这个 ...
- 【BZOJ3456】轩辕朗的城市规划 无向连通图计数 CDQ分治 FFT 多项式求逆 多项式ln
题解 分治FFT 设\(f_i\)为\(i\)个点组成的无向图个数,\(g_i\)为\(i\)个点组成的无向连通图个数 经过简单的推导(枚举\(1\)所在的连通块大小),有: \[ f_i=2^{\f ...
- [BZOJ3456]城市规划(生成函数+多项式求逆+多项式求ln)
城市规划 时间限制:40s 空间限制:256MB 题目描述 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一 ...
- BZOJ 3456: 城市规划 [多项式求逆元 组合数学 | 生成函数 多项式求ln]
3456: 城市规划 题意:n个点组成的无向连通图个数 以前做过,今天复习一下 令\(f[n]\)为n个点的无向连通图个数 n个点的完全图个数为\(2^{\binom{n}{2}}\) 和Bell数的 ...
- bzoj 3456 城市规划——分治FFT / 多项式求逆 / 多项式求ln
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3456 分治FFT: 设 dp[ i ] 表示 i 个点时连通的方案数. 考虑算补集:连通的方 ...
- bzoj 3456 城市规划 —— 分治FFT / 多项式求逆 / 指数型生成函数(多项式求ln)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3456 首先考虑DP做法,正难则反,考虑所有情况减去不连通的情况: 而不连通的情况就是那个经典 ...
- 指数型生成函数 及 多项式求ln
指数型生成函数 我们知道普通型生成函数解决的是组合问题,而指数型生成函数解决的是排列问题 对于数列\(\{a_n\}\),我们定义其指数型生成函数为 \[G(x) = a_0 + a_1x + a_2 ...
- 多项式求ln,求exp,开方,快速幂 学习总结
按理说Po姐姐三月份来讲课的时候我就应该学了 但是当时觉得比较难加上自己比较懒,所以就QAQ了 现在不得不重新弄一遍了 首先说多项式求ln 设G(x)=lnF(x) 我们两边求导可以得到G'(x)=F ...
随机推荐
- Confluence无法打开编辑器,一直在转圈
在管理员界面中,将Collaborative editing 设置为Off 或者 Limited . 快速找到该界面的方式是,在搜索框里搜索 “Collaborative editing”. 折腾了几 ...
- sklearn中的分词函数countVectorizer()的改动--保留长度为1的字符串
1简述问题 使用countVectorizer()将文本向量化时发现,文本中长度唯一的字符串会被自动过滤掉,这对于我在做的情感分析来讲,一些表较重要的表达情感倾向的词汇被过滤掉,比如文本'没用的东西, ...
- HDFS系列 -- HDFS预研
1 HDFS概述 由于传统集中式的物理服务器在存储容量和数据传输速度等方面都有限制,故而越来越不符合这些数据的实际存储需要. 在大数据时代,大数据处理需要解决的首要问题是:如何高效地存储所产生的规模庞 ...
- idea中实体类序列化后生成序列化版本ID的方法
为什么要添加序列化版本ID了(serialVersionUID)? 通过判断实体类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVers ...
- WebService测试工具介绍及下载
1 LoadRunner LoadRunner,是一种预测系统行为和性能的负载测试工具.通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问 题,LoadRunner能够对整个企业架构 ...
- html转jsp部分css不可用
解决方法 <%String path = request.getContextPath();String basePath = request.getScheme()+"://&quo ...
- HDU 2106 decimal system (进制转化求和)
题意:给你n个r进制数,让你求和. 析:思路就是先转化成十进制,再加和. 代码如下: #include <iostream> #include <cstdio> #includ ...
- Python 插件(add-in)基础知识
1) Python插件为何物 一个插件(add-in)就是一个客户化,比如嵌入到ArcGIS应用程序中的工具条上的一系列工具,这些工具作为ArcGIS标准程序的补充可以为客户完成特殊任务. ArcG ...
- DIV+CSS 中的 overflow:hidden
overflow:hidden这个CSS样式是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是很了解. 一提到清除浮动,我们就会想到另外一个CSS样式 ...
- 获取iOS 设备上崩溃日志 (Crash Log)的方法
1. iTunes同步获取 大部分用户会使用iTunes软件来管理iPhone,这样同步的Crash日志就会同步到电脑上,我们需要在特定的路径里面查找 Mac OS X:~/Library/Logs/ ...