https://atcoder.jp/contests/abc253/tasks
Ex - We Love Forest
一个n点0边的图 G
给序列u[1..m], v[1..m]
做k次操作
每次1~m中等概率选i, 连接ui,vi, (允许重边, 没有自环
对于k = 1…n-1
计算 图是森林的概率
mod 998244353
n 14
m 500
2s
1024mb
我的思路
n 这么小
问题其实就是说k次选择没有出现重边, 也没有产生环的概率
如果只是重边 还很好做, 但是问题是如何判断没有环的概率
然后说 有没有把并查集状态 全部表示出来, 但这样看似乎n又很大
f(x) = x个点的并查集状态的数
考虑和其中最小点1在一起的点数
f(x) = sum binom(x,i) f(x-1-i), i = 0..x-1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| n = 15 a = [0 for i in range(n)] a[0] = 1
fac = [1 for i in range(n)] for i in range(1,n): fac[i] = fac[i-1]*i def binom(n,m): return fac[n]//fac[n-m]//fac[m]
for i in range(1,n): for j in range(i): a[i] += binom(i-1,j) * a[i-1-j] print(i,a[i])
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 1 1 2 2 3 5 4 15 5 52 6 203 7 877 8 4140 9 21147 10 115975 11 678570 12 4213597 13 27644437 14 190899322
|
状态数量接受不了, 更别提转移代价了
但是如果 容斥看 指定一个mask中的点构成树, 其余任意的话, 能否容斥
并想不出 容斥的单独属性
除非是 每个mask中是森林, 但是既然都是森林了不如直接算出答案
如果每个mask是树, 所有的并交没有意义?