2019.01.03 bzoj3456: 城市規劃(生成函式+多項式取對)
傳送門
生成函式好題。
題意:求n個點的簡單(無重邊無自環)無向連通圖數目
思路:
對簡單無向圖構造生成函式
然後令答案的生成函式為
由於
是由
平湊而成,所以有
所以
然後上一波多項式取對即可。
程式碼:
#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 Tree(DP + 生成函式 + 多項式模運算)
大致題意:給定一個集合{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