LOJ 2542 隨機遊走

2022-04-30 10:09:06 字數 1760 閱讀 3330

解:首先minmax容斥變成經過集合t的第乙個點就停止的期望步數。對於某個t,設從x開始的期望步數為f(x)

如果x∈t,f(x) = 0。否則f(x) = ∑f(y) / in[x] + 1

樹上高斯消元。從葉子往上,可以發現每個點都可以表示為af(fa) + b

於是我們推一波式子,參考,就可以對每個t,o(n)求出f(root)。

然後每個詢問就列舉子集。

注意dfs的時候可以剪枝,遇到x∈t就返回,否則t飛.....

1 #include 2

3const

int n = 30, mo = 998244353;4

5 inline void read(int &x)

13return;14

}1516struct

edge edge[n << 1]; int

tp;19

20int n, rt, e[n], a[n], b[n], now, in[n], ans[1

<< 19], cnt[1

<< 19], ans2[1

<< 19

];21

22 inline int qpow(int a, int

b) 30

return

ans;31}

3233 inline void add(int x, int

y) 40

41void dfs(int x, int

f) 46

int sa = 0, sb = 0;47

for(int i = e[x]; i; i =edge[i].nex)

5455 a[x] = qpow(in[x] - sa, mo - 2

);56 b[x] = 1ll * a[x] * (in[x] + sb) %mo;

5758

return;59

}6061int

main()

6970

int lm = 1

<

71/*

for(now = 1; now < lm; now++)

*/76 memset(ans, -1, sizeof

(ans));

77 memset(ans2, -1, sizeof

(ans2));

7879

for(register int i = 1; i < lm; i++)

8283

///prework over

84for(register int i = 1, k; i <= q; i++)

91int ans = 0;92

if(ans2[s] != -1

) 95

else

102if(cnt[t] & 1) ans = (ans + ans[t]) %mo;

103else ans = (ans - ans[t] + mo) %mo;

104}

105 ans2[s] =ans;

106}

107 printf("

%d\n

", (ans + mo) %mo);

108}

109110

return0;

111 }

ac**

LOJ2542 PKUWC2018 隨機遊走

分析 sum limits 1 min sum limits na i sum limits 1 j binom sum limits 1 min sum limits na i n i 0 sum limits 1 min a n max 設 f 表示 f 第一次走到 s 狀態的期望步數。這個東西...

初識隨機遊走

隨機遊走 random walk 又稱隨機游動或隨機漫步。在我們生活中處處都存在著與random walk有關的自然現象,例如氣體分子的運動,滴入水中的墨水,氣味的擴散等 如圖1.4 random walk是擴散過程的基礎,因此它被廣泛地用於對物理和化學等擴散現象的模擬上。此外,random wal...

064 隨機遊走

隨機遊走模擬 模擬醉漢隨機遊走,醉漢的起點在 25 25 並且在周圍徘徊 include irvine32.inc walkmax 50startx 25starty 25 定義結構體 drunkardwalk struct path coord walkmax dup 0,0 pathsused ...