傳送門
這題的弱化版
\(prufer\) 序列題。
我們先考慮度數確定的點,記度數確定的點有 \(k\) 個,它們在 \(prufer\) 序列中一共出現 \(cnt\) 次。
首先我們要從 \(prufer\) 序列的 \(n - 2\) 個位置中選 \(cnt\) 個來放這些點,然後我們考慮
先不確定其它 \(n - k\) 個點的位置,此時方案數為:\(\frac }\)
那麼剩下 \(n - k\) 個點怎麼處理呢?我們考慮把他們直接塞到剩下 \(n - 2 - cnt\) 個空中去就好了 \(q \omega q\) ,方案數就是乙個乘法原理:\((n - k) ^ \)
最後的答案就是 \(\frac }(n - k) ^ \)
稍微化簡一下:
\[\begin
ans& = \frac }(n - k) ^ \\
& = \frac \times \frac }(n - k) ^ \\
& = \frac }(n - k) ^
\end
\]然後寫個高精直接求就是了
#include #include using namespace std;
const int _ = 1e3 + 5;
struct biginteger
biginteger clean()
biginteger operator = (int x)
biginteger operator * (const int& x)
biginteger operator / (const int& x)
return this -> clean();
}void output()
} ans;
int n, k, s, d[_];
int main()
for (int i = 1; i <= n; ++i) if (d[i] != -1) ++k, s += d[i] - 1;
if (s > n - 2)
ans = 1;
for (int i = 1; i <= n - 2; ++i) ans = ans * i;
for (int i = 1; i <= n - 2 - s; ++i) ans = ans * (n - k);
for (int i = 1; i <= n - 2 - s; ++i) ans = ans / i;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= d[i] - 1; ++j) ans = ans / j;
ans.output();
return 0;
}
HNOI2008 明明的煩惱
如果按照樹形態dp,是不可做的。我們直接按照prufer序列組合數求即可。看成乙個 n 2 長度的序列。對於固定的度,相當於盒子中放球,然後剩下的未定的,相當於從剩下位置中隨便放。因為要高精度,所以用的py ac fac 1 1010 def c n,m return fac n fac m fac...
洛谷P2624 HNOI2008 明明的煩惱
題目描述 題解 來補一補 purfer text purfer 序。可以考慮每次選擇編號最小的葉子,然後刪掉並且在序列中新增加與它連邊的節點。這樣會得到乙個長度為 n 2 n 2n 2 的序列。考慮如何將乙個 n 2 n 2n 2 的序列變成一棵樹。首先我們可以得到每個點的度為序列 現次數 1 1 ...
HNOI2008 玩具裝箱
p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓 縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為1.n的n件玩具,第i件玩具經過 壓縮後變成一維長度為ci.為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。同時如果乙...