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...