傳送門
觀察到 \(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的血量 血量減到...