洛谷
首先發現每條邊除了邊權之外都是等價的,所以可以考慮每一條邊的出現次數。
顯然欽定一條邊之後構成生成樹的方案數是\(2*n^\)。可以直接\(purfer\)序列算。
也可以發現每一條邊的出現次數相等,樹的總數是\(n^\),每次出現\(n-1\)條邊,每條邊又是等價的。
也可以算出上面這個值。
於是要算的東西就變成了
\[\displaystyle \sum_^n\sum_^n(i+j)^k
\]這個東西不對稱,很不方便計算,所以可以變成:
\[\frac(\sum_^n \sum_^n (i+j)^k-\sum_^n (i+i)^k)
\]\(k\)次方這個東西顯然是個\(k+1\)次多項式,可以套進去直接拉格朗日插值計算。
拆一下變成了\(\displaystyle \sum_^ (i-1) i^k+\sum_^(2n-i+1)i^k-\sum_^n 2^ki^k\)。
然後預處理之後,可以用拉格朗日插值可以在\(o(k)\)的複雜度裡算出上面的式子,然後帶回去算期望就行了。
然後這裡怎麼拉格朗日插值。
以第乙個函式為例。
令\(f(n)=\sum_^n (i-1)i^k\),因為\(i^\)次方大概是乙個\(k+2\)次多項式,所以我們需要\(k+3\)個值,那麼顯然這個函式的前\(k+3\)項我們在預處理之後是可以提前算出來的。
然後根據拉格朗日插值的公式,對於乙個\(k\)次多項式而言:
\[p(x)=\sum_^p(x_i)\prod_^\frac
\]然後因為我們選擇的值是連續的若干項,所以可以簡單的寫成:
\[p(x)=\sum_^p(x_i)\frac}\prod_^(x-x_j)
\]在這題裡,我們都已經知道\(x\)是\(n\)了,所以後半部分的\(prod\)可以用前字尾的方式快速預處理出來,這樣子我們就可以\(o(k)\)的計算前面的部分了。
#include#includeusing namespace std;
#define mod 998244353
#define max 10000100
inline int read()
int n,k,n,ans;
int inv[max],jv[max],suf[max],pre[max];
bool zs[max];
int pri[max],tot,pw[max];
int fpow(int a,int b)return s;}
void sieve(int n) }}
int p[max];
int calc(int n)
int main()
《洛谷P5343 XR 1 分塊》
一道非常好的題,太菜了調了很久,細節非常多。首先,將題意轉化一下,由給定的兩段都有的長度,可以組成多少種組合。設dp i 表示,長度為i的方案數。那麼有轉移,dp i sum dp i a j tot為兩段都有的元素個數,注意要去重 這裡雖然可以用無限數量的揹包思想,但是顯然這樣更好。然後dp轉移,...
洛谷 P5535 XR 3 小道訊息
你可能需要用到的定理 伯特蘭 切比雪夫定理。對於所有大於1的整數n,至少存在乙個質數p,符合n p 2n。而k 1 2,滿足條件,所以就分情況討論即可 當k 1為質數,且 n 1 2 k 1 n 1 因為 2 n 1 沒有數為它的倍數,即任何數與它互質,所以只需要一天即可 當k 1為質數,且k 1 ...
洛谷 XR 3 核心城市(樹的直徑,樹形dp)
先考慮乙個點。肯定是在樹的直徑的中間rt。樹的直徑就是樹上距離最遠的兩個點的路徑。對於樹的直徑求法,常用的有兩種。兩遍bfs或dfs,從任意乙個點開始,找到距離這個點最遠的點i,再從i開始,找到距離i這個點距離最遠的點j,則i j就是樹的直徑的兩個端點 證明略 樹形dp也可以求。再推廣到n個點。以r...