PKUWC2018 隨機遊走

2022-07-05 19:42:09 字數 2053 閱讀 7272

題目需要求訪問完所有點(假設有 \(n\) 個)的期望步數,也就是要求

\[e(\max\)

\]這裡 \(x_1\)、\(x_2\)、\(\cdots\)、\(x_n\) 表示第一次到達對應編號的關鍵點的時間。

根據min-max容斥,有

\[e(\max\)=e(\max\)=e\left(\sum_(-1)^\min\\right)=\sum_(-1)^e(\min\)(s'\ne\phi)

\]最後一步等號根據期望的線性性。

對於某乙個集合 \(s\),設 \(f_u\) 表示從節點 \(u\) 開始,第一次到達任意給定點期望步數。根據期望dp:當 \(u\in s\) 時

\[f_u=0

\]當 \(u\not\in s\) 時

\[f_u=\frac1\left(f_+\sum_f_v\right)+1

\]直接高斯消元複雜度很劣。注意到這是一棵樹。

根據線性代數的知識,使用待定係數法。令 \(f_u=k_uf_+b_u\),轉化下原式

\[\begin

&f_u=\frac1\left(f_+\sum_k_vf_u+b_v\right)+1\\

&\rightarrow deg_uf_u=f_+f_u\sum_k_v+\sum_b_v+deg_u\\

&\rightarrow f_u\left(deg_u-\sum_k_v\right)=f_+\sum_b_v+deg_u\\

&\rightarrow f_u=\frac1k_v}f_+\fracb_v}k_v}

\end

\]因此有

\[\begin

\begin

k_u&=\frac1k_v}\\

b_u&=\fracb_v}k_v}

\end

\end

\]當 \(u \in s\) 時,\(k_u=b_u=0\)。

可以使用dp求係數。由於本題的特殊性(\(n\) 很小,或者題目***),不存在分母為模數的倍數的情況。故求出係數,複雜度為 \(\mathcal o(n\log p)\),注意要求逆元。總共要求 \(2^n\) 種情況,故複雜度為 \(\mathcal o(n2^n\log p)\)。

預處理所有詢問,發現實際上是乙個子集列舉,使用fwt優化即可。注意係數。這部分複雜度 \(\mathcal o(n2^n)\)。總複雜度為 \(\mathcal o(n2^n\log p)\)。

#include const int n = 19, p = 998244353;

int n, q, x;

struct edge e[n * 2];

int g[n], edges = 0;

void adde(int u, int v) ; g[u] = edges - 1;

}int inc(int a, int b)

int qpow(int a, int b)

int k[n], b[n];

void dfs(int u, int f, int s)

int deg = f ? 1 : 0, k = 0, b = 0;

for (int i = g[u], v; ~i; i = e[i].nxt)

if (v = e[i].v, v != f)

dfs(v, u, s), deg++, k = inc(k, k[v]), b = inc(b, b[v]);

k[u] = qpow(inc(deg, p - k), p - 2);

b[u] = 1ll * k[u] * (deg + b) % p;

}int a[1 << n];

void fwt(int *a, int n, int op)

int main()

for (int s = 1; s < 1 << n; s++)

fwt(a, 1 << n, 1);

while (q--)

return 0;

}

PKUWC2018 隨機遊走

loj 2542.pkuwc 2018 隨機遊走 最值反演 樹上期望dp 其實不是很難啦 min max容斥既視感 設f x 表示從x走到s中第乙個點的期望步數 f x 1 d x f fa x 1 d x f ch x 1 這個有環 利用f x a f fa x b的套路代換 得到a,b的遞推式 ...

PKUWC2018 隨機演算法

題意 給定乙個圖 n 20 定義乙個求最大獨立集的隨機化演算法 產生乙個排列,依次加入,能加入就加入 求得到最大獨立集的概率 本質就是計數題 每個點有三種狀態 考慮過且在獨立集中,考慮過未在獨立集中,未考慮 本來在集合裡的點不能知道有哪些,而且不能加入的點的排列也不好確定。乙個好的方法是 把考慮過的...

PKUWC2018 隨機演算法

題目 思博狀壓寫不出是不是沒救了呀 首先我們直接狀壓當前最大獨立集的大小顯然是不對的,因為我們的答案還和我們考慮的順序有關 我們發現最大獨立集的個數好像不是很多,可能是 o n 級別的,於是我們考慮從這個方面入手 我們求出所有的最大獨立集,考慮求出有多少種考慮順序能夠恰好得到這個最大獨立集 設當前已...