給出一棵樹,每次隨機選擇乙個葉子節點(可以重複選),將其染黑,問樹上不經過黑點的最長鏈變短的期望染色次數是多少。
這題的主要思路是用總代價除以總方案數。
樹的直徑有乙個或兩個必經點,當直徑長度為奇數時,直徑的中點即為必經點,可以將有希望成為直徑上的葉子節點根據它屬於必經點的哪棵子樹進行分類,得到多個葉子集合,若直徑長度為偶數,則有一條必經邊,根據邊將有可能成為直徑上的葉子結點分成兩個集合。
然後就可以發現直徑變短時,有且只有乙個集合中含有可能成為直徑上的葉子結點沒有被染黑,然後可以就可以列舉哪乙個集合沒有被染黑來計算總代價數。
當m
mm個葉子節點中有x
xx個集合中的點已經被染黑時,再染黑乙個集合中的葉子結點的期望步數為msu
m−
x\frac
sum−xm
,可以據此來計算某個方案的代價。
令這棵樹上共有m
mm個葉子節點,集合中的葉子數量總和為sum
sumsu
m,此時考慮的集合大小為u
uu,染色結束後,這個集合中有i(i
i(ii(
i個葉子結點已被染黑。
則這中情況的總方案數為(ui
)(i
u)(表示從u
uu個點中選出i
ii個)∗(s
um−u
+i−1
)!∗(
sum−
u)
*(sum-u+i-1)!*(sum-u)
∗(sum−
u+i−
1)!∗
(sum
−u)(表示這sum
−u+i
sum-u+i
sum−u+
i個點被染黑的順序種數,注意最後乙個染黑的點不能在這個集合中)∗(u
−i)!
*(u-i)!
∗(u−i)
!(表示把剩餘點染黑的順序種數,因為最後除的總方案是sum
!sum!
sum!
,所以可以看作完成任務後繼續把所有點染黑)
花費的代價為∑i=
u−i+
1sum
mi
\sum_^\frac
∑i=u−i
+1su
mim
,根據代價計算方式,不難理解,然後把兩者相乘,也就是:
inline ll calc
(ll u)
return res;
}
最後再除以總方案數sum
!sum!
sum!
即可。
#include
#include
#include
#define ll long long
#define n 500100
#define m 998244353
using
namespace std;
ll n,m,bb,mx,mm,ans,sum,first[n]
,fa[n]
,cnt[n]
,jc[n]
,ds[n]
,need[n]
;bool gg[n]
;struct bn
bn[n<<1]
;inline ll po
(ll u,ll v)
return res;
}inline
void
add(ll u,ll v)
void
dfs(ll now,ll last,ll dep)
}ll dfs
(ll now,ll last,ll ned)
return res;
}inline ll c
(ll u,ll v)
inline ll calc
(ll u)
return res;
}int
main()
for(i=
1;i<=n;i++)if
(ds[i]==1
) m++
;dfs(1
,-1,
0); mx=0;
dfs(mm,-1
,0);
for(i=mm,j=
1;j<=mx/
2;j++
,i=fa[i]);
if(mx&1)
else
}for
(i=1
;i<=n;i++
) need[i]
=need[i-1]
+m*po
(sum-i+
1,m-2)
%m,need[i]
%=m;
for(i=
1;i<=n;i++
) cout
,m-2
)%m;
}
UOJ 351 新年的葉子
試題描述 躲過了alphago 之後,你躲在 singledog 的長毛裡,和它們一起來到了alphago 的家。此時你們才突然發現,alphago 的家居然是乙個隱藏在地下的計算中心!難道 alphago 如此人贏的秘密是.它其實是乙個 ai?根據情報,這個地下的計算中心的結構構成了一棵無根樹,整...
uoj 176 新年的繁榮
給出乙個完全圖,邊權為兩點權值的and,求最大生成樹。這題用最小生成樹的boruvka演算法。大概就是每次找到每乙個聯通塊權值最大的邊,將這些聯通塊合併,直到只剩乙個聯通塊。因為每次聯通塊的個數至少減半,所以只會做log次操作。那麼這題相當於每個點有不同顏色,要找到每個點的異色點中最大的and值。扔...
uoj 175 新年的網警
在這新年的第一天,猴族首領猴腮雷打算來整治一下網路風氣。這時,他聽說在乙個叫做 universal oj 使用者群 的 qq 群中有人在散播 開 謠言 車 於是他就派了一群網警把這個使用者群裡的人都抓了回來,試圖找到謠言的源頭。這個使用者群中有 nn 個人,這些人中存在 mm 對雙向的直接認識關係,...