乙個有 \(n\) 個節點的樹,設它的節點分別為 \(v_1,v_2,\ldots,v_n\),已知第 \(i\) 個節點 \(v_i\) 的度數為 \(d_i\),問滿足這樣的條件的不同的樹有多少棵。
\(1\le n\le 150\),保證滿足條件的樹不超過 \(10^\) 個。
既然點有了度數限制,那麼等價於 prufer 序列上這個點出現次數必須是 \(\mathrm_i-1\)。
問題轉化為乙個長度為 \(n-2\) 的序列,\(i\) 出現次數為 \(\mathrm_i-1\) 的方案數。顯然等於
\[\frac_(\mathrm_i-1)!}
\]由於題目保證了答案不超過 long long 範圍,那麼直接分解質因數最後再乘起來即可。
時間複雜度 \(o(n^2)\)。
#include using namespace std;
typedef long long ll;
const int n=155;
int n,deg[n],cnt[n][n],a[n];
ll ans;
int main()
} for (int j=1;j<=n;j++)
a[j]+=cnt[n-2][j];
for (int i=1;i<=n;i++)
if (deg[0]!=n-2) return printf("0"),0;
ans=1;
for (int i=1;i<=n;i++)
for (;a[i];a[i]--) ans*=i;
printf("%lld",ans);
return 0;
}
洛谷 P2290 HNOI2004 樹的計數
輸入格式 輸入檔案第一行是乙個正整數n,表示樹有n個結點。第二行有n個數,第i個數表示di,即樹的第i個結點的度數。其中1 n 150,輸入資料保證滿足條件的樹不超過10 17個。輸出格式 輸出滿足條件的樹有多少棵。輸入樣例 1 4 2 1 2 1 輸出樣例 1 2題解 質因數分解 prufer數列...
題解 P2290 HNOI2004 樹的計數
乙個有 n 個節點的樹,設它的節點分別為 v1,v2,v nv 1,v 2,ldots,v n v1 v2 vn 已知第 i 個節點 v iv i vi 的度數為 d id i di 問滿足這樣的條件的不同的樹有多少棵 有關樹的形態計數,考慮prufer序列 每個prufer序列對應乙個無根樹,如果...
洛谷p2602 數字計數
題目描述 給定兩個正整數a和b,求在 a,b 中的所有整數中,每個數碼 digit 各出現了多少次 一開始想歪了,想去列舉每一位,然後統計每一位的情況。轉念一想,數字dp是統計 a,b 內符合條件的數字的個數。換一種方法,對key 0,9 統計含1個key,2個key len len為數字的長度 個...