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)\) 做了,代码跑得很快完全不用担心时限。

posted @ 2024-11-28 14:20  LarrixAntofanin  阅读(14)  评论(0)    收藏  举报