清華集訓 小 Y 和恐怖的奴隸主

2022-05-02 02:00:09 字數 1142 閱讀 1442

傳送門

觀察到 \(m\) 的值很小,考慮把不同血量的隨從的個數計入狀態。

設 \(dp_\) 表示在第 \(i\) 次攻擊之後,還剩 \(a\) 個一血怪,\(b\) 個二血怪,\(c\) 個三血怪的概率。

轉移很顯然,只需要注意生成新怪的情況即可。

但是這對於 \(n \le 10^\) 來說是完全不行的。

我們考慮矩陣加速。

首先我們對每乙個合法的三元組 \((a, b, c)\) 進行編號(可以發現可能的最大值是 \(166\))。

然後我們把這些編號看做矩陣的行列,構造轉移矩陣。

簡單的說,我們記錄狀態之間轉移的概率,然後再新增一行、一列來記錄期望。

對於一種局面 \((a, b, c)\),它對答案的貢獻是 \(\frac}\)。

然後我們就可以快樂的矩陣快速冪了…………才怪。

分析一下複雜度,發現每次都跑一次快速冪是跑不過的。

所以我們不妨預處理 \(dp_i\) 表示 \(2 ^ i\) 個轉移矩陣的乘積,然後每次只要用乙個行向量乘上 \(\log\) 次 \(dp_i\) 就可以了。

參考**:

#include const int p = 998244353;

int t, m, k, ans[170], tmp[170]; long long n;

int n = 1, inv[12], id[12][12][12];

void add(int& a, int b)

struct matrix

matrix operator * (matrix b) const

} dp[170];

void mul(matrix a)

void power(long long n)

int main()

if (m == 3)

dp[0][x][x] = dp[0][x][n + 1] = inv[a + b + c + 1];

}dp[0][n + 1][n + 1] = 1;

for (int i = 1; i <= 60; ++i) dp[i] = dp[i - 1] * dp[i - 1];

while (t--)

return 0;

}

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

是不是這題太水了都沒人寫啊 本題官方題解提供的做法實際上複雜度非常高 很顯然本題的 text 是儲存每種血量的隨從數量 設狀態數量的上限是 s 當 m 3,k 8 時,這樣的狀態一共有 s 165 1 種 如果直接 dp 每次轉移是 o 1 的,可以做到 o n cdot s 顯然無法處理 n 較大...

Luogu P4007 小 Y 和恐怖的奴隸主

link 設 f 為第 i 次攻擊時,場上還有 a,b,c 個 1,2,3 血的隨從的概率。轉移隨便討論一下就行了。設 g i 表示前 i 次攻擊對 boss 造成的期望傷害,轉移就是 frac1f rightarrow g i 因為 k le8 所以實際上狀態很少,總共只有 z 166 個。倍增預...

恐怖的奴隸主 bob

試題3 恐怖的奴隸主 bob 源 bob.cpp 輸入檔案 bob.in 輸出檔案 bob.out 時間限制 1s 空間限制 512mb 小l熱衷於undercards.在undercards中,有四個格仔。每個格仔要麼是空的,要麼住著乙隻bigbob。每個bigbob有乙個不超過k的血量 血量減到...