1. 程式人生 > >2019.01.03 bzoj3456: 城市規劃(生成函式+多項式取對)

2019.01.03 bzoj3456: 城市規劃(生成函式+多項式取對)

傳送門
生成函式好題。
題意:求n個點的簡單(無重邊無自環)無向連通圖數目


思路:
對簡單無向圖構造生成函式 f ( x ) = n

2 C n 2 x n n
!
f(x)=\sum_n2^{C_n^2}\frac{x^n}{n!}
然後令答案的生成函式為 g ( x )
= n c n x n n ! g(x)=\sum_nc_n\frac{x^n}{n!}

由於 f ( x ) f(x) 是由 g ( x ) g(x) 平湊而成,所以有 f ( x ) = e g ( x ) f(x)=e^{g(x)} 所以 g ( x ) = l n f ( 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<<
            
           

相關推薦

2019.01.03 bzoj3456: 城市規劃生成函式+多項式

傳送門 生成函式好題。 題意:求n個點的簡單(無重邊無自環)無向連通圖數目 思路: 對簡單無向圖構造生成函式 f (

2019.01.02 poj3046 Ant Counting生成函式+dp

傳送門 生成函式基礎題。 題意:給出 n n n個數以及它們的數量,求從所有數中選出

Luogu5162 WD與積木生成函式+多項式求逆

  顯然的做法是求出斯特林數,但沒有什麼優化空間。   考慮一種暴力dp,即設f[i]為i塊積木的所有方案層數之和,g[i]為i塊積木的方案數。轉移時列舉第一層是哪些積木,於是有f[i]=g[i]+ΣC(i,j)·f[i-j],g[i]=ΣC(i,j)·g[i-j] (j=1~i)。   考慮優化 。我們

[Codeforces 438E]The Child and Binary Tree生成函式 + 多項式開平方

Address 洛谷 RemoteJudge Codeforces 438E Meaning 給定一個 n

[BZOJ3204][Sdoi2013]城市規劃線段樹+並查集

這道資料結構題真的變態。 看到 MM 才 66 但 NN 有 105105 ,想到使用線段樹來維護行,又由於詢問與連通塊有聯絡,因此又想到並查集。 具體地,線段樹每個節點如果表示區間 [l,r][l,r] ,則它要儲存: ansans : 第 ll 行到第

CodeForces 438E The Child and Binary TreeDP + 生成函式 + 多項式模運算

    大致題意:給定一個集合{Cn},一棵二叉樹上的所有節點的點權值從這個集合中選取。現在給定一個m,問對於1..m中的每一個數字i,權值和恰好為i的不同的二叉樹的個數有多少個。這裡形態不同但點權集合的二叉樹視為兩種方案。 與前面做的題目類似,

2018.12.31 bzoj3992: [SDOI2015]序列統計生成函式+ntt+快速冪

傳送門 生成函式簡單題。 題意:給出一個集合 A = {

[BZOJ3456]城市規劃(生成函數+多項式求逆+多項式求ln)

n) 100% 存在 d+ ont inner tar 現在 一行 城市規劃 時間限制:40s 空間限制:256MB 題目描述 剛剛解決完電力網絡的問題, 阿貍又被領導的任務給難住了. 剛才說過, 阿貍的國家

[JZOJ3303][BZOJ3456] 城市規劃多項式】【生成函式】【未完成】

Description 剛剛解決完電力網路的問題, 阿狸又被領導的任務給難住了. 剛才說過, 阿狸的國家有n 個城市, 現在國家需要在某些城市對之間建立一些貿易路線, 使得整個國家的任意兩個城市都直接或間接的連通. 為了省錢, 每兩個城市之間最多隻能有一條直接的貿易路徑. 對

【MaxCompute官宣】大資料計算技術共享計劃 — 技術公開課第四季進行中!2018.12.11-2019.01.03

你可知,每個時代,都悄悄犒賞會學習的人。因此,我在這裡等你主動,一起演繹新的故事。 MaxCompute在2018年的雙11全球購物狂歡節中,以單日處理資料量超過500PB再次衝擊新極限,書寫新記錄。 既然崇拜,不如走近,一探究竟。 MaxCompute是什麼? 答 >>

bzoj3456: 城市規劃 生成函式 多項式求逆 多項式求ln

bzoj3456: 城市規劃 題目傳送門 分析 方法1:算二次法 考慮一張 n n n點

014、映象的快取特性2019-01-03 週四

參考 https://www.cnblogs.com/CloudMan6/p/6839420.html     構建centos-wget 映象前本地沒有快取centos映象,在構建的第一步需要dokcer pull centos映象

2019.01.02 poj1322 Chocolate生成函式+二項式定理

傳送門 生成函式好題。 題意簡述:一個袋子裡有 c c c種不同顏色的球,現要操作

2019.01.02 NOIP訓練 三七二十一生成函式

傳送門 生成函式基礎題。 題意簡述:求由1,3,5,7,9這5個數字組成的n位數個數,要求其中3和7出現的次數都要是偶數。 考慮對於每個數字構造生成函式。 對於1,5,9:

bzoj3456 城市規劃

ret 化簡 include bzoj tdi 解決 總數 所在 繼續 Description 求含有n個點有標號的無向聯通圖的個數(沒有重邊),n<=130000 Input 3 Output 4

BZOJ3456: 城市規劃 多項式求逆

sca 如果 數據 fpm void its bzoj3456 limit set 3456: 城市規劃 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 798 Solved: 451[Submit][Status][Di

BZOJ3456: 城市規劃

BZOJ3456: 城市規劃 https://lydsy.com/JudgeOnline/problem.php?id=3456 分析: 設\(f[n]\)表示\(n\)個點的答案, \(g[n]\)表示總方案數。 列舉和\(1\)連通的點的個數, \(f[n]=g[n]-\sum\limit

2019.09.03貝殼校招部分題解

這是第一次去試水,好長好長時間沒A過題,菜的有點受不了,~~~爆零恥辱下課~~~ 題目一 描述 輸入n,m;n可以進行 -1,*2操作, 問至少多少次操作才能得到 m  樣例: 輸入 4 5 輸出 3 思路: 剛開始想複雜了!!! 簡單想:  當n小於m的時

2019.01.02 bzoj5300: [Cqoi2018]九連環fft優化高精+快速冪

傳送門 題意不好描述(自己看樣例解釋) 首先可以推出一個遞推式: f n