試題描述
躲過了alphago 之後,你躲在 singledog 的長毛裡,和它們一起來到了alphago 的家。此時你們才突然發現,alphago 的家居然是乙個隱藏在地下的計算中心!難道 alphago 如此人贏的秘密是...它其實是乙個 ai?
根據情報,這個地下的計算中心的結構構成了一棵無根樹,整個計算中心名為被 at-field 的力場保護起來,保護力場的直徑恰好等於樹的直徑(樹的直徑定義為樹上距離最遠的兩個結點之間的距離,結點 \(u,v\) 的距離定義為從 \(u\) 到 \(v\) 最少需要經過的邊數)。
由於保護力場的存在,singledog 們每次只能進入整棵樹的乙個葉子(度為 \(1\) 的結點),由於狗的大腦很小,他們每次只會隨機進攻乙個原樹的葉子,並且破壞裡面的裝置,更加狼狽的是他們甚至會重複進入乙個已經被破壞過的葉子。
比如這棵樹中,singledog 們攻擊的就是 \(3,4,7\) 這三個點,他們不會攻擊 \(2\) 號點,因為它不是原樹的葉子。
他們想知道,期望多少次之後,可以使得保護力場的直徑縮小?
即,對於一棵樹,每次隨機染黑乙個葉子(可能會重複染黑),期望多少次後直徑變小?
輸入從標準輸入讀入資料。
第一行乙個正整數 \(n\),表示樹的點數。
接下來 \(n−1\) 行,每行兩個正整數 \(x,y\),表示樹上的一條邊。
輸出輸出到標準輸出。
輸出一行乙個整數表示答案在模 \(998244353\) 意義下的取值。
即設答案化為最簡分式後的形式為 \(\frac\) ,其中 \(a\) 和 \(b\) 互質。輸出整數 \(x\) 使得 \(bx \equiv a(\mod 998244353)\) 且 \(0 \le x < 998244353\)。可以證明這樣的整數 \(x\) 是唯一的。
輸入示例1
3
1 22 3
輸出示例11
輸入示例26
1 22 3
1 44 5
1 6
輸出示例2499122178
資料規模及約定
對於所有資料,\(3 \le n \le 5 \times 10^5\),\(1 \le x,y \le n\)。
題解首先考慮一下直徑的性質,若直徑長度為偶數條邊,所有直徑的中點是相同的;否則所有直徑最中間那條邊是相同的。
令 \(l\) 為直徑長度。
那麼對於偶數的情況,我們將 \(u\) 的每個兒子中深度為 \(\frac\) 的所有葉子放在乙個集合當中,這樣當染到只有乙個集合內還有未被染黑的葉子時直徑一定變短了;
若 \(l\) 為奇數,那麼所有深度為 \(\frac\) 的葉子一定在同乙個子樹中,把所有不在那個子樹中的深度為 \(\frac\) 的葉子放到乙個集合中就可以按照和偶數情況一樣處理了。
現在需要把問題轉化一下,把「每次可以染黑點」改成「每次一定染白點」,但是這樣改之後每一步的期望不再是 \(1\) 了,所以我們令這個期望是 \(x\),然後嘗試計算出來。
具體來說,現在有 \(n\) 個葉子,有 \(m\) 個白的,其餘都是黑的,那麼染乙個白色葉子需要期望多少步。考慮下一步染色的兩種情況,分別是染黑色葉子和染白色葉子,兩種情況概率分別是 \(\frac\) 和 \(\frac\),如果染白色葉子那麼目標已經完成,所以期望步數是 \(1\),否則相當於沒做任何操作,所以期望步數還是 \(x\),所以我們可以列乙個方程
\[x = \fracx + \frac
\]解得 \(x = \frac\)。
現在我們列舉集合 \(x\),假裝它最終沒有被染黑(即忽略掉它),在這種情況下染黑其它所有集合中的節點的期望步數是多少?很顯然就是每一步的期望的疊加,令 \(n\) 表示總葉子數,\(s\) 表示所有集合中葉子的總數,期望步數就是 \(\sum_^ \frac\),這裡就是將關係的點看成白色,忽略的點看成黑色。
如果我們將對於所有 \(x\) 的這個期望直接累加肯定不是答案,它算多了。這是因為我們那麼算期望步數的時候並沒有考慮集合 \(x\) 內的葉子的染色情況,也就是說它們被全部染黑的情況也被統計進去了;所以我們多算的部分就是所有集合中的葉子都染黑的情況。注意到只有在最後一步染黑的集合不是 \(x\) 的時候才會多算,也就是說在列舉到集合 \(x\) 的時候我們多算的是 \(\sum_ 最後一步將集合\ y\ 染黑,使得所有集合中的葉子全黑的期望步數\)。那麼多算的部分就是(令集合個數為 \(t\),\(e(y)\) 表示「最後一步將集合 \(y\) 染黑,使得所有集合中的葉子全黑的期望步數」)
\[\sum_x \sum_ e(y) \\
= \sum_y e(y) \sum_ 1 \\
= \sum_y e(y) \cdot (t - 1) \\
= (t - 1) \sum_y e(y)
\]所以多算的就是 \((t-1)\) 倍的將所有集合中的葉子染黑的期望步數,最後減去這個數就好了。
#include #include #include #include #include #include using namespace std;
#define rep(i, s, t) for(int i = (s), mi = (t); i <= mi; i++)
#define dwn(i, s, t) for(int i = (s), mi = (t); i >= mi; i--)
int read()
while(isdigit(c))
return x * f;
}#define maxn 500010
#define maxm 1000010
#define mod 998244353
#define ll long long
int n, m, head[maxn], nxt[maxm], to[maxm], deg[maxn];
void addedge(int a, int b)
int step[maxn], fa[maxn], q[maxn], hd, tl;
int bfs(int s)
} int mx = 0, mxi;
rep(i, 1, n) if(step[i] > mx) mx = step[i], mxi = i;
return mxi;
}int mxh[maxn], tot[maxn];
void dp(int u, int pa)
return ;
}int siz[maxn], cnts, inv[maxn], sum[maxn];
int main()
int a = bfs(1), b = bfs(a), len = step[b];
rep(i, 1, len >> 1) b = fa[b];
dp(b, 0);
for(int e = head[b]; e; e = nxt[e]) if(mxh[to[e]] + 1 == (len + 1 >> 1)) siz[++cnts] = tot[to[e]];
if(len & 1)
int n = 0, sn = 0;
rep(i, 1, n) n += deg[i] == 1;
rep(i, 1, cnts) sn += siz[i];
inv[1] = 1;
rep(i, 2, n) inv[i] = (ll)(mod - mod / i) * inv[mod%i] % mod;
sum[0] = 0;
rep(i, 1, n)
int ans = 0;
rep(i, 1, cnts)
ans -= (ll)(cnts - 1) * sum[sn] % mod;
if(ans < 0) ans += mod;
printf("%d\n", ans);
return 0;
}
UOJ 351 新年的葉子
給出一棵樹,每次隨機選擇乙個葉子節點 可以重複選 將其染黑,問樹上不經過黑點的最長鏈變短的期望染色次數是多少。這題的主要思路是用總代價除以總方案數。樹的直徑有乙個或兩個必經點,當直徑長度為奇數時,直徑的中點即為必經點,可以將有希望成為直徑上的葉子節點根據它屬於必經點的哪棵子樹進行分類,得到多個葉子集...
uoj 176 新年的繁榮
給出乙個完全圖,邊權為兩點權值的and,求最大生成樹。這題用最小生成樹的boruvka演算法。大概就是每次找到每乙個聯通塊權值最大的邊,將這些聯通塊合併,直到只剩乙個聯通塊。因為每次聯通塊的個數至少減半,所以只會做log次操作。那麼這題相當於每個點有不同顏色,要找到每個點的異色點中最大的and值。扔...
uoj 175 新年的網警
在這新年的第一天,猴族首領猴腮雷打算來整治一下網路風氣。這時,他聽說在乙個叫做 universal oj 使用者群 的 qq 群中有人在散播 開 謠言 車 於是他就派了一群網警把這個使用者群裡的人都抓了回來,試圖找到謠言的源頭。這個使用者群中有 nn 個人,這些人中存在 mm 對雙向的直接認識關係,...