bzoj1005 prufer 明明的煩惱

2021-08-17 10:01:49 字數 2054 閱讀 6957

1005: [hnoi2008]明明的煩惱

time limit: 1 sec memory limit: 162 mb

submit: 6358 solved: 2471

[submit][status][discuss]

description

自從明明學了樹的結構,就對奇怪的樹產生了興趣……給出標號為1到n的點,以及某些點最終的度數,允許在

任意兩點間連線,可產生多少棵度數滿足要求的樹?

input

第一行為n(0 < n < = 1000),

接下來n行,第i+1行給出第i個節點的度數di,如果對度數不要求,則輸入-1

output

乙個整數,表示不同的滿足要求的樹的個數,無解輸出0

sample input

-1-1

sample output

2 hint

兩棵樹分別為1-2-3;1-3-2

source

[submit][status][discuss]

沒有給邊,又有度數限制,顯然是prufer。

我們只考慮有度數限制的點。

他們顯然可以在prufer中出現度數-1次,組合數算一下。最後prufer中還空多少個,每乙個空都能用所有的-1來填,就是-1的數量^

這題高精度,記得判非法(**寫的蠢,好久前寫的了)

因為涉及到除法,所以我是分解質因數寫的高精。

#include#include#include

#include#include#include#includeusing namespace std;

int n,m;

inline int read()

const

int n=1100;

int left,unknown;

struct cc

else

if(a.c[i]==b.c[j])

else

}for(;i<=a.len;++i) c.c[++c.len]=a.c[i],c.p[c.len]=a.p[i];

for(;j<=b.len;++j) c.c[++c.len]=b.c[j],c.p[c.len]=b.p[j];

return c;

}friend inline cc operator /(cc a,cc b)

else

if(a.c[i]==b.c[j])

}for(;i<=a.len;++i) c.c[++c.len]=a.c[i],c.p[c.len]=a.p[i];

return c;

}}ans,fac[n];

int prime[n];

bool is[n];

inline cc trans(int x)

}return c;

}inline cc c(int n,int m)

return fac[n]/fac[m]/fac[n-m];

}int left;

const

int inf=1e4;

struct dd

while(a.num[a.len

+1])

return a;

}};inline void printf(cc x)

}printf("%d",y.num[y.len]);

for(int i=y.len

-1;i>=1;--i)

printf("%04d",y.num[i]);

}int main()

}for(int i=1;i<=n;++i)

fac[i]=fac[i-1]*trans(i);

left=n-2;

int x;

for(int i=1;i<=n;++i)

ans=ans*c(left,x-1);

left=left-x+1;}}

for(int i=1;i<=left;++i)

ans=ans*trans(unknown);

printf(ans);

}

BZOJ 1005 prufer序列 分解質因數

已知度數的節點可能的組合方式如下 n 2 d1 1 d2 1 dk 1 left 乙個乙個編號去放,對於第乙個確定度數的編號可以有c n 2,d1 1 種放法,第二個c n 2 d1 1 d2 1 寫出來後發現可以約一些階乘。剩餘left個位置由未知度數的節點隨意填補,方案數為m left 於是最後...

BZOJ 1430 小猴打架 prufer編碼

prufer編碼和無根樹的轉化問題 樹化prufer 在葉子節點中尋找編號最小的節點,將與之相連的父節點加入prufer佇列裡,然後刪去該葉子節點,直至圖中只剩下2個節點,於是prufer數列共有n 2位 於是對於乙個完全圖求生成樹的個數,他的prufer序列裡有 n 2 位,每一位均可取1 n,於...

bzoj1211 樹的計數 prufer編碼

prufer編碼大概就是將一顆無根樹對應到乙個序列裡面,然後構造就是不斷找最小的度數為1的點然後將他的father加進去。不難發現每個編號的出現次數就是deg 1 includeusing namespace std const int n 300 typedef long long ll ll a...