ABC 356 题解

C

题目大意

\(N\) 个编号分别为 \(1, 2, \dots, N\) 的钥匙。

其中一些是真钥匙,其他的都是假钥匙。

有一扇门,你可以插入任意数量的钥匙。

只有插入至少 \(K\) 把真钥匙,门才会打开。

已经对这些钥匙进行了 \(M\) 次测试。

其中,第 \(i\) 次测试过程如下:

  • \(C_i\) 把钥匙,分别是 \(A_{i,1}, A_{i,2}, \dots, A_{i,C_i}\) 插入门。
  • 测试结果用一个英文字母 \(R_i\) 表示。
    • \(R_i=\) o 表示在第 \(i\) 次测试中门打开了。
    • \(R_i=\) x 表示在第 \(i\) 次测试中门没有打开。

\(2^N\) 种可能的钥匙组合,在这些组合中,你需要找出与任何测试结果都不矛盾的组合数。

给定的测试结果有可能是错误的,没有任何组合满足条件。在这种情况下,输出 \(0\)

思路

就是暴力,但赛时时间复杂度分析错误(我以为是 \(2^n\times n\times m\times k\),实际应是 \(2^n\times n\times m\)),导致没做出来。

实际极限情况运算次数约为 \(2^{15}\times 15\times 100=49152000\approx 5\times 10^7\),可以通过。

D

题目大意

给定整数 \(N\)\(M\) ,计算 \(\displaystyle \sum_{k=0}^{N}\) \(\rm{popcount}\) \((k \mathbin{\&} M)\)\(998244353\) 的结果。

思路

赛时没有一点思路,反映出我位运算练的少。

建议大家阅读官方题解,比较清晰,而且可以提升英语阅读能力。

E

题目大意

给你一个长度为 \(N\) 的序列 \(A=(A_1,\ldots,A_N)\)

\(\displaystyle \sum_{i=1}^{N-1}\sum_{j=i+1}^{N}\left\lfloor\frac{\max(A_i,A_j)}{\min(A_i,A_j)}\right\rfloor\) .

这里, \(\lfloor x \rfloor\) 表示不大于 \(x\) 的最大整数。例如, \(\lfloor 3.14 \rfloor=3\)\(\lfloor 2 \rfloor=2\)

思路

好像和官方想一块去了,但觉得自己写的不够好,于是参考了官方题解。

\(A\) 中最大的元素是 \(M\) .

我们要对所有满足 \(i<j\)\((i,j)\) 进行求和,又因为可以看出我们改变顺序并不会影响答案,于是乎我们可以重新排列序列 \(A\)

那么,我们把 \(A\) 按升序排序。

此时,如果 \(i<j\) ,就有 \(A_i \leq A_j\) ,所以 \(\displaystyle \left\lfloor\frac{\max(A_i,A_j)}{\min(A_i,A_j)}\right\rfloor = \left\lfloor\frac{A_j}{A_i}\right\rfloor\)

于是,原式可以变形为: \[ \displaystyle \sum_{i=1}^{N-1}\sum_{j=i+1}^{N}\displaystyle \left\lfloor\frac{A_j}{A_i}\right\rfloor = \sum_{i=1}^{N-1}\sum_{n}n*g(A_i,n) \]

其中 \(g(d,n)\) 是满足 \(\displaystyle \left\lfloor\frac{A_j}{d}\right\rfloor=n\)\(j\) 的个数。

\(C_x\) 是满足 \(A_i=x\)\(i\) 的个数(此处原文可能笔误,题解上写的是 with,我觉得应该是 wich)。

通过预处理 \(C\) 的前缀和,可以 \(O(1)\) 算出 \(f(d,n)\),具体见代码。

时间复杂度不证了,是 \(O(m\log n)\),可以通过。

总结&致谢

还是练得少,手比较生。

另外反映出我的两个问题:

  1. 位运算掌握不牢
  2. 分析时间复杂度方面掌握不牢

感谢 AtCoder 官方,提供了好题以及题解供我参考。