LOJ2462 完美的集合(2018集训队互测)
题意:
给定一棵树,每个点有重量 \(w_i\) 和价值 \(v_i\),每条边有长度 \(c_i\)。
定义一个完美的点集 \(S\):\(S\) 连通、\(S\) 总重 \(\le M\) 且 \(S\) 的价值最大。(即在所有连通且总重 \(\le M\) 的集合中,\(S\) 的价值最大)
定义一个结点 \(x\) 能测试结点 \(y\),当且仅当 \(dist(x,y)\le \dfrac{Max}{v_y}\)。定义一个结点 \(x\) 能测试一个点集 \(S\),当且仅当 \(x\in S\) 且 \(x\) 能测试 \(S\) 中所有结点。
小 A 要从所有完美的集合中选 \(K\) 个构成方案。定义一个方案合法:存在一个结点 \(x\) 能测试所有被选的集合。
问有多少个合法方案。对 \(5^{23}\) 取模。
\(n\le 60,M\le 10^4,c_i,w_i,v_i,K\le 10^9,Max\le 10^{18}\)。
一个显然的结论是能 test 一个结点的结点是一个连通块(一棵树)。但是这有什么用?
树上,点个数 - 边个数 = 1.
定义 \(ANS_1=\sum_{x}\text{能被 x test 的 k 个集合选法总数}\),\(ANS_2=\sum_{(u,v)\in T}\text{能被 u,v 同时 test 的 k 个集合选法总数}\)。则 \(ANS_1-ANS_2\) 即为答案。
为什么?考虑对于一组固定的 \(S_1\sim S_k\),能 test 它们的 \(x\) 是一个连通块。对于这样一组集合选法,我们只希望计数 \(1\),所以刚好点数 - 边数 = 1。交换一下求和顺序和 \(ANS_1-ANS_2\) 等价了。
转化为两个问题:
-
固定 \(x\),使得 \(x\) test 的集合选法有几种。
-
固定 \(u,v\),使得 \(u,v\) 都 test 的集合选法有几种。
因为 \(x\) 固定了,所以每个结点能不能选也确定了,这就是为什么上面要搞那一堆东西。
第二种是类似的,只考虑第一种。
为了判定集合是否完美,首先需要知道所有总重 \(\le M\) 的集合最大权值是多少。这可以用 dfs 序 DP 做:枚举一个根,然后 \(O(nm)\) 做。复杂度 \(O(n^2m)\)。
然后我们再来一次 dfs 序 DP 求有几种选法。\(dp[i][j]\) 表示当前 dfn = i,总重 \(j\) 的最大价值。\(cnt[i][j]\) 表示取到 \(dp[i][j]\) 的选法总数。看 \(dp[n+1][?]\) 是否是上面求出的最大价值,决定 \(cnt[n+1][?]\) 是否贡献。
看似已经大功告成,但还有一个问题:怎么对 \(5^{23}\) 取模???
可以使用 exLucas 定理,戳这里