本文接自此篇部落格,旨在記錄一些更有趣(?)的內容。
決定完善這篇部落格是因為看見了這個題.於是便以這道題目的題解為主線寫這篇blog.
\(op=1,2\)的時候的答案可以看上文提到的blog.
\(op=3\)時的問題也就是無標號有根樹的計數,在上篇blog裡以烷烴計數舉例,在這裡考慮去掉度數限制後的做法。
記\(f_i\)為\(i\)個點的答案。考慮枚舉子樹大小以及該大小的子樹的數量進行轉移,但是複雜度過高。把轉移用生成函式的形式寫出來的話有:
\[f(x)=x\prod_(\sum_x^)^=x\prod_(\frac)^
\]其意義如下:最前面乘的\(x\)表示根節點,\(\sum_x^\)表示某個大小為\(i\)的子樹有幾個,它的\(f_i\)次冪則對應著所有大小為\(i\)的子樹的方案數。之後再把\(k\)用封閉形式丟掉。
看見這個乘積很煩人,考慮對兩邊去取\(\ln\).
\[\ln f(x)=\ln x-\sum_f_i\ln(1-x^i)
\]再同時求個導。
\[\frac=\frac+\sum_if_i\frac}
\]去分母。
\[xf'(x)=f(x)+f(x)\sum_if_i\frac
\]看起來沒啥花樣了?我們把\(f_n\)請回來:
\[nf_n=f_n+\sum_f_i\sum_kf_k([x^]\frac)
\]考慮一下後面那個帶\(x\)的項是什麼,由於\(\frac=\sum_x^\),那麼它再乘上\(x^k\)後,也只有次數是\(k\)的倍數的項的係數為1,於是我們得到了這樣子的式子:
\[nf_n=f_n+\sum_f_i\sum_kf_k[k|n-i]
\]\[f_n=\frac^f_i\sum_kf_k}
\]記\(g_i=\sum_jf_j\),得到了最終的式子:
\[f_n=\frac^f_ig_}
\]邊界條件\(f_0=0,f_1=1\).
在轉移的過程中求出了乙個\(f\)的同時維護\(g\),總時間複雜度\(o(n^2)\), **見下。
思路和烷基計數差不多?
考慮已經求出了有根樹的答案\(f_n\),如何求無根樹的答案\(h_n\), 主要的問題還是去掉樹的形態相同但根不同的方案數。於是想到對每個形態的樹欽點某個點為根。這個點最好還要和樹的大小有關,不難想到欽點樹的重心為根。
先考慮\(n\)為奇數的情況,此時每棵樹有且僅有乙個確定的重心,那麼如果當前根不是重心的話,它一定有乙個大小大於\(\lfloor \frac\rfloor\)的子樹,於是有:
\[h_n=f_n-\sum_ \rfloor+1}^f_if_
\]接著考慮\(n\)為偶數的情況,稍微麻煩一點的是我們需要考慮當前樹有兩個重心的情況。如果只有乙個重心的話我們只需要和奇數一樣減去不合法的情況。而當有兩個重心時,這兩個點一定通過一條邊相連,且把這條邊斷開後,只有在形成的兩棵子樹大小一致但形態不同時才會有多算的情況,綜上所述可得計算式:
\[h_n=f_n-\sum_+1}^f_if_-\dbinom}}
\]於是就可以做到單個的\(o(1)\)計算了,**如下:
int solve3()
return f[n];
}int c2(int x)
int solve4()
return h[n];
}
神經網路Version2
a demo to bp nerual network format long define the sigmoid function f x 1 1 exp x enter the learning rate eta 0.5 x 0.05,0.10 y 0.01,0.99 modified b 1...
2 SAT問題的小結
什麼是2 sat呢?就是有一些集合,每個集合中有且僅有兩個元素,且不能同時選取兩個元素,集合間的元素存在一定的選擇關係,求解可行性及可行方案。1 連邊 2 跑tarjan 3 判可行性,即同一集合中的兩個點是否同屬乙個強連通塊 4 縮點建新圖,連反邊 5 拓撲序,若當前點沒有被訪問過,則選擇該點,不...
計蒜客 2n皇后問題
題目描述 給定乙個 n n 的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入 n 個黑皇后和 n 個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角 線上,任意的兩個白皇后都不在同一行 同一列或同一條對角線上。問總共有多少種放法?n 小於等於8 輸入格式 輸入的第一行為乙個整數 n ...