[題解]UVA11021 Tribles
阿新 • • 發佈:2020-11-16
我們一開始有\(k\)只生物,這是很難搞的,所以可以先考慮一開始只有1只生物,
設\(p[i]\)表示一開始有\(1\)只生物,第\(i\)天所有生物死光光的概率,
求出\(p[m]\)後,\(ans = p[m]^{k}\),
為什麼呢,就是乘法公式哦,也可以感謝理解下,把一開始的\(k\)生物一隻一隻分開,它們和它們的子孫後代就是一個個互不干涉的家族,總共有\(k\)個家族,在第\(m\)天所有的\(k\)個家族都滅門的概率不就是\(p[m]^k\)嗎?滑稽(
所以現在我們只要求\(p[m]\),先給出式子:
\[s[i] = \sum_{j=0}^{n-1}p[j]*s[i-1]^j \]來理解下,假如昨天存活的生物生了\(j\)個後代(這\(j\)個後代是獨立的,互不干涉),每個後代在今天肯定會,死的概率就是它昨天出生的概率\(s[i-1]\),所以\(j\)個全死的概率就是\(s[i-1]^j\),列舉\(j\)相加就好
#include <cstdio> #include <cstring> typedef double db; const int N = 1e3 + 30; int T, n, m, k, cnt; db p[N], s[N]; db POW(db t, int num) { db ans = 1; while (num) { if (num & 1) ans *= t; t *= t, num >>= 1; } return ans; } int main() { scanf ("%d", &T); while (T--) { scanf ("%d%d%d", &n, &k, &m); for (int i = 0; i < n; ++i) scanf ("%lf", &p[i]); s[1] = p[0]; for (int i = 2; i <= m; ++i) { s[i] = 0; for (int j = 0; j < n; ++j) s[i] += p[j] * POW(s[i - 1], j); } printf ("Case #%d: %.7lf\n", ++cnt, POW(s[m], k)); } return 0; }