1. 程式人生 > >LOJ2325「清華集訓 2017」小Y和恐怖的奴隸主(期望概率+矩陣快速冪)

LOJ2325「清華集訓 2017」小Y和恐怖的奴隸主(期望概率+矩陣快速冪)

LOJ2325「清華集訓 2017」小Y和恐怖的奴隸主

題意:

"A fight? Count me in!" 要打架了,算我一個。

"Everyone, get in here!" 所有人,都過來!

小Y是一個喜歡玩遊戲的OIer。一天,她正在玩一款遊戲,要打一個Boss。

雖然這個Boss有10100​​點生命值,但它只帶了一個隨從——一個只有 m 點生命值的“恐怖的奴隸主”。

這個“恐怖的奴隸主”有一個特殊的技能:每當它被扣減生命值但沒有死亡(死亡即生命值 0),且Boss的隨從數量小於上限 k,便會召喚一個新的具有 m點生命值的“恐怖的奴隸主”。

現在小Y可以進行

n次攻擊,每次攻擊時,會從Boss以及Boss的所有隨從中的等概率隨機選擇一個,並扣減1 點生命值,她想知道進行 n次攻擊後扣減Boss的生命值點數的期望。為了避免精度誤差,你的答案需要對998244353取模。

資料範圍
1T1000,1n1018,1m3,1k8

題解:

最樸素的DP,利用概率算期望,記錄第i輪,分別有j,k,l個血量為1,2,3的奴隸主的概率。
DP[i+1][j][k][l]+=k/j/l

j+k+l+1DP[i][j][k][l]
每個狀態都有1j+k+l+1攻擊boss,有1j+k+l+1dp[i][j][k][l]的貢獻。

n太大了,考慮矩陣快速冪。
如何把後面三維壓成一維呢?
發現所有合法狀態最多C102+C92+...+C22=165個,
可以直接把所有狀態之間的轉移關係列出來,然後跑矩陣快速冪。
但是,複雜度為O(tot3logn),要T。

複雜度的瓶頸在於T組資料,每次矩陣*矩陣都是tot3,
但其實我們只需要答案那個

1×tot的陣列。
那麼,預處理出2的冪次方的矩陣,由於矩陣乘法的結合率,
Ans=IniMaxn=IniMax(101...0)2=IniMax2sMax2s1...Max20
一項一項,每次都是Ans向量乘矩陣,複雜度O(tot3logn+Ttot2logn)

學習:

  • 對於和的期望不好求,可以算每個狀態的概率*它的貢獻。(不過逆推可以較容易地求得和的期望)
  • 表示清晰的多維DP陣列難以矩陣快速冪,但是可以看看所有狀態有多少,把狀態間的關係列出來,就可以轉移。
  • 對於在貢獻在中間統計的情況,例如這個1j+k+l+1dp[i][j][k][l]的處理,矩陣多開一位當計數器即可,既繼承上一個,又加上新增的。
  • 當然這道題可以逆推,即