NOIP2024模拟赛35
A. 甚魔
这是一道很轻松的 \(Trie\) 树应用模拟题。考虑把每个值塞到 \(Trie\) 树里面,然后把每个统计每个大于 \(k^i\) 的异或值的个数,最后差分出答案即可。
因为时求的大于,所以可能会比 \(10^{18}\) 多一个 \(k\),所以会炸 long long,要开 __int128,而且 \(Trie\) 树要从更高位开始。
B. 图上问题
图上的诈骗问题。考虑到如果在边双里的点,如果要到边双以外的点,一定可以不经过重复的边用多条路径把每个点都覆盖到。所以我们把边双缩点后在树上 \(DP\) 就行了。
大概 \(DP\) 式就是 \(dp_p = siz_p/sum_p + \sum{dp_q}\)。\(O(n)\) 预处理逆元就可以大大降低时间复杂度。
C. 原始人,起洞!
用组合数优化 \(DP\)。
先可以考虑最朴素的 \(O(n^3)\) 的 \(DP\)。
\(dp_{i,j}\) 表示放 \(i\) 个 \(1\) 在大小为 \(j\) 数里的方案数。则有 \(dp_{i,j} = \sum\limits_{k=i}^{j}dp_{i-1,k-1}-[i\times 2-1\ge k\) and \(i\ne j]\)。
这个 \(DP\) 很容易优化,可以直接写成 \(O(n^2)\) 的样子:\(dp_{i,j} = dp_{i,j-1}+dp_{i-1,j-1}-[i\times 2-1\ge j\) and \(i\ne j]\)。
而我们可以把 \(dp\) 和 \(-[i\times 2-1\ge j\) and \(i\ne j]\) 分开来算。考虑用组合数算贡献。
\(dp\) 直接就是 \(C_n^k\),而后面需要减的部分是 \(-\sum\limits_{i=1}^k\sum\limits_{j=i+1}^{min(n,2i-1)} C_{n-j}^{k-i}\)。这个式子是很明显的变上项求和的差分,套公式就变成了 \(-\sum\limits_{i=1}^k C_{n-i+1}^{k-i+1}-C_{n-min(n,2*i-1)}^{k-i+1}\)。这样就可以 \(O(\sum k)\) 做了,代码跑得很快完全不用担心时限。

浙公网安备 33010602011771号