HNOI2008 明明的煩惱

2022-05-02 01:51:09 字數 1380 閱讀 9074

傳送門

這題的弱化版

\(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教授要求在乙個一維容器中的玩具編號是連續的。同時如果乙...