传送门

生成函数好题。

题意:求n个点的简单(无重边无自环)无向连通图数目


思路:

对简单无向图构造生成函数f(x)=∑n2Cn2xnn!f(x)=\sum_n2^{C_n^2}\frac{x^n}{n!}f(x)=∑n​2Cn2​n!xn​

然后令答案的生成函数为g(x)=∑ncnxnn!g(x)=\sum_nc_n\frac{x^n}{n!}g(x)=∑n​cn​n!xn​

由于f(x)f(x)f(x)是由g(x)g(x)g(x)平凑而成,所以有f(x)=eg(x)f(x)=e^{g(x)}f(x)=eg(x)所以g(x)=lnf(x)g(x)=lnf(x)g(x)=lnf(x)

然后上一波多项式取对即可。

代码:

#include<bits/stdc++.h>
#define ri register int
#define add(a,b) ((a)+(b)>=mod?(a)+(b)-mod:(a)+(b))
#define dec(a,b) ((a)>=(b)?(a)-(b):(a)-(b)+mod)
#define mul(a,b) ((ll)(a)*(b)%mod)
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
typedef long long ll;
const int mod=1004535809;
int n,lim,tim;
vector<int>A,B,pos,Inv,ifac,fac;
inline void init(const int&up){
	lim=1,tim=0;
	while(lim<=up)lim<<=1,++tim;
	pos.resize(lim),A.resize(lim),B.resize(lim),pos[0]=0;
	for(ri i=0;i<lim;++i)pos[i]=(pos[i>>1]>>1)|((i&1)<<(tim-1));
}
inline int ksm(int a,ll p){int ret=1;for(;p;p>>=1,a=mul(a,a))if(p&1)ret=mul(ret,a);return ret;}
inline void ntt(vector<int>&a,const int&type){
	for(ri i=0;i<lim;++i)if(i<pos[i])swap(a[i],a[pos[i]]);
	for(ri mid=1,wn,mult=(mod-1)/2,typ=type==1?3:(mod+1)/3;mid<lim;mid<<=1,mult>>=1){
		wn=ksm(typ,mult);
		for(ri j=0,len=mid<<1;j<lim;j+=len)for(ri k=0,a0,a1,w=1;k<mid;++k,w=mul(w,wn)){
			a0=a[j+k],a1=mul(w,a[j+k+mid]);
			a[j+k]=add(a0,a1),a[j+k+mid]=dec(a0,a1);
		}
	}
	if(type==-1)for(ri i=0,inv=ksm(lim,mod-2);i<lim;++i)a[i]=mul(a[i],inv);
}
struct poly{
	vector<int>a;
	poly(int k=0,int x=0){a.resize(k+1),a[k]=x;}
	inline int&operator[](const int&k){return a[k];}
	inline const int&operator[](const int&k)const{return a[k];}
	inline int deg()const{return a.size()-1;}
	inline poly extend(const int&k){poly ret=*this;return ret.a.resize(k+1),ret;}
	friend inline poly operator+(const poly&a,const poly&b){
		poly ret(max(a.deg(),b.deg()));
		for(ri i=0;i<=a.deg();++i)ret[i]=add(ret[i],a[i]);
		for(ri i=0;i<=b.deg();++i)ret[i]=add(ret[i],b[i]);
		return ret;
	}
	friend inline poly operator-(const poly&a,const poly&b){
		poly ret(max(a.deg(),b.deg()));
		for(ri i=0;i<=a.deg();++i)ret[i]=add(ret[i],a[i]);
		for(ri i=0;i<=b.deg();++i)ret[i]=dec(ret[i],b[i]);
		return ret;
	}
	friend inline poly operator*(const int&a,const poly&b){
		poly ret(b.deg());
		for(ri i=0;i<=b.deg();++i)ret[i]=mul(a,b[i]);
		return ret;
	}
	friend inline poly operator*(const poly&a,const poly&b){
		int n=a.deg(),m=b.deg();
		init(n+m);
		poly ret;
		for(ri i=0;i<=n;++i)A[i]=a[i];
		for(ri i=0;i<=m;++i)B[i]=b[i];
		for(ri i=n+1;i<lim;++i)A[i]=0;
		for(ri i=m+1;i<lim;++i)B[i]=0;
		ntt(A,1),ntt(B,1);
		for(ri i=0;i<lim;++i)A[i]=mul(A[i],B[i]);
		return ntt(A,-1),ret.a=A,ret;
	}
	inline poly poly_inv(poly a,const int&k){
		if(k==1)return (poly){0,ksm(a[0],mod-2)};
		a=a.extend(k);
		poly f0=poly_inv(a,(k+1)>>1);
		return (2*f0-((f0*f0.extend(k))*a).extend(k)).extend(k);
	}
	inline poly poly_direv(const poly&a){
		poly ret(a.deg()-1);
		for(ri i=0;i<=ret.deg();++i)ret[i]=mul(a[i+1],i+1);
		return ret;
	}
	inline poly poly_inter(const poly&a){
		poly ret(a.deg()+1);
		for(ri i=1;i<=ret.deg();++i)ret[i]=mul(a[i-1],Inv[i]);
		return ret;
	}
	inline poly poly_ln(poly a,const int&k){
		poly ret=a.poly_direv(a);
		return ret=(ret*a.poly_inv(a,k)).extend(k),ret.poly_inter(ret);
	}
};
int main(){
	n=read(),Inv.resize(n*2+1),fac.resize(n*2+1),ifac.resize(n*2+1),Inv[1]=1,fac[0]=fac[1]=ifac[0]=1;
	for(ri i=2;i<=n*2;++i)Inv[i]=mul(Inv[mod%i],mod-mod/i),fac[i]=mul(fac[i-1],i);
	for(ri i=1;i<=n*2;++i)ifac[i]=mul(Inv[i],ifac[i-1]);
	poly a(n);
	a[0]=a[1]=1;
	for(ri i=2;i<=n;++i)a[i]=mul(ksm(2,(ll)i*(i-1)/2),ifac[i]);
	int len=1;
	while(len<=n)len<<=1;
	a=a.poly_ln(a,len);
	cout<<mul(a[n],fac[n]);
	exit(0);
	return 0;
}

2019.01.03 bzoj3456: 城市规划(生成函数+多项式取对)的更多相关文章

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

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

  2. Tensorflow学习笔记2019.01.03

    tensorflow学习笔记: 3.2 Tensorflow中定义数据流图 张量知识矩阵的一个超集. 超集:如果一个集合S2中的每一个元素都在集合S1中,且集合S1中可能包含S2中没有的元素,则集合S ...

  3. BZOJ3456 城市规划 【多项式求ln】

    题目链接 BZOJ3456 题解 真是一道经典好题,至此已经写了分治\(NTT\),多项式求逆,多项式求\(ln\)三种写法 我们发现我们要求的是大小为\(n\)无向联通图的数量 而\(n\)个点的无 ...

  4. BZOJ3456 城市规划(多项式求逆)

    设f[i]为连通图的数量,g[i]为不连通图的数量,显然有f[i]=2i*(i-1)/2-g[i],g[i]通过枚举1所在连通块大小转移,有g[i]=Σf[j]*C(i-1,j-1)·2(i-j)*( ...

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

    题目链接 BZOJ3456 题解 之前我们用分治\(ntt\)在\(O(nlog^2n)\)的复杂度下做了这题,今天我们使用多项式求逆 设\(f_n\)表示\(n\)个点带标号无向连通图数 设\(g_ ...

  6. 洛谷P4841 城市规划(生成函数 多项式求逆)

    题意 链接 Sol Orz yyb 一开始想的是直接设\(f_i\)表示\(i\)个点的无向联通图个数,枚举最后一个联通块转移,发现有一种情况转移不到... 正解是先设\(g(n)\)表示\(n\)个 ...

  7. [bzoj3456]城市规划:多项式,分治

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

  8. 001-电脑操作规范-2019年03月.doc

    001-电脑操作规范-2019年03月.doc   本文作者:徐晓亮 BoAi 作者腾讯QQ号码:595076941   /////////////////////////////////////// ...

  9. 黑洞有毛 or 黑洞无毛:4星|《环球科学》2019年03月号

    <环球科学>2019年03月号 高水平的科普杂志.本期我感兴趣的话题有: 1:65岁以上老年人是转发假新闻的主力: 2:人的面孔特征可以通过50个维度来定义: 3:华裔科学家发现人脑颞叶中 ...

随机推荐

  1. Beginning C# Programming with Unity

    Welcome to the wonderful world of programming! In this book you’ll learn the basics of programming u ...

  2. stm32 map文件的分析

    相信有较大项目开发经验的朋友都曾遇到内存溢出的问题,那么大家都是如何分析这类问题的呢?大家遇到HardFault_Handler 有对map分析过吗? 首先讲述一下关于map在MDK-ARM中的配置. ...

  3. java链接JDBC中的?问题

    String sql = "select * from student where name= ?"; PreparedStatement pst = conn.prepareSt ...

  4. Djang的model创建的字段和参数复习

    class test_orm(models.Model): id = models.AutoField(primary_key=True) # int自增列,必须填入参数primary_key=Tru ...

  5. 小服务程序(Java Servlet)

    一般来说,servlet说起来挺高大上的,但是其实实际就是一个能够交互地浏览和修改页面数据,生成一个动态的Web页面. Servlet方法,页面实施请求数据,后台服务器给出响应,将数据返回到页面中去. ...

  6. 在别家网站上执行自己的js代码(谷歌浏览器)(谷歌扩展程序)

    @参考文章1  @参考文章2 日前针对一家投标网站进行了程序干预,且一定程度的干预成功,把方法给大家提取分享出来,感谢上述两篇博文 测试网站:百度https://www.baidu.com/ 测试步骤 ...

  7. EasyUI Dialog 对话框默认不弹出和关闭清空对话框内容

    EasyUI中文网: http://www.jeasyui.net/plugins/181.html 默认不弹出:closed:true 模式化窗口(有遮罩):modal:true <div c ...

  8. java 向上转型和向下转型

    学习向上转型和向下转型怎么用没多难,但是为什么那样用,我搞了很多次没弄明白.没弄明白的原因是平时学习时之看例子,而例子一般都比较简单,没有对象之间的调用,一般就是一个对象调用自己的方法. 首先看下怎么 ...

  9. Oracle Linux下数据库操作的相关问题

    1.su - oracle 切换到oracle用户 lsnrctl status 查看数据库监听状态 lsnrctl start 打开数据库监听 2.Connected to an idle inst ...

  10. 使用VNC连接管理VPS

    本文基于:Kvm+Windows2008 VPS+VNCviewer 有时候遇上IP没设置好,IP被封,调整磁盘,重置windows系统密码等等使用基于VNC的控制台对VPS进行操作是非常方便的. 有 ...