ldh的模拟赛题解
\(\tt{A\ Even\ Triangle}\)
一道送分的题,为了不要平均分太低。
首先可以发现,每一行的项数其实是一个形如 \(2,4,6,8,\dots\) 的等差数列,那么可以求出最后一项就是 \(2 \times (\frac{\frac{(2+n)*n}{2}}{2}-1)\),那么前一项就是 \(2 \times (\frac{\frac{(2+n)*n}{2}}{2}-1)-2\),再对其求 \(\operatorname{lcm}\).
注意到两个数的最大公约数必定是 \(2\),那么可以直接除以 \(2\),这样时间复杂度就为 \(O(1)\).
注意开一下 \(\tt{ll}\) 就可以。
\(\tt{B\ Fake\ Median\ and\ Mode}\)
对于伪中位数,很明显直接求就可以。当 \(n\) 是奇数时,伪中位数就是 \(\frac{n}{2}+1\);当 \(n\) 是偶数时,伪中位数就是 \(\frac{\frac{n}{2}+(\frac{n}{2}+1)}{2}\).
对于众数,开个桶计数就可以。
时间复杂度 \(O(n)\).
也是一道送分的。
\(\tt{C\ Same\ or\ Different}\)
首先要先注意,\(l\) 不一定小于 \(r\),所以我们要先交换 \(l\) 和 \(r\),后文保证 \(l \leq r\).
很容易想到暴力,就是直接循环判断 \(a_l \sim a_r\) 的数是否相同。但是时间复杂度无法承受。
那么考虑优化,很明显我们可以在 \(a_i\ne a_{i-1}\) 的地方打上标记,然后将其相加起来。其实也就是差分+前缀和两种算法,然后在查询的时候查询 \(s_l\) 是否等于 \(s_r\) 就可以了。
\(\tt{D\ T\ Prime}\)
先看一下题意,暴力是很好写的,这道题暴力分给的很足,共给了 \(50\tt{pts}\).(原来只有 \(30\tt{pts}\))
接下来我们先看一下 \(t=2\) 的情况,很明显就是我们常用的素数。
再看一下 \(t=3\) 的情况,显然 \(3\) 素数的约数一定包含 \(1\) 和它本身。那剩下一个约数,就只能是 \(\sqrt{n}\),否则约数个数就只能是 \(4\).再继续看 \(n\) 有什么性质,\(n\) 一定要是素数,否则 \(n\) 就可以分解成若干个素数乘积,那么这样约数个数就会多余 \(3\).
那么我们可以继续扩展,可以发现 \(t\) 是素数的话除了 \(2\) 就一定是奇数,那么也就满足 \(\sqrt{n}\) 这个性质。不难发现,如果 \(\sqrt{n}\) 继续开根,那么约数个数就会对应减 \(2\),那么这样递归回去也可以回到 \(t=3\) 的情况。
根据我们推出的这个结论,我们可以用埃氏筛或欧拉筛先筛出质数,然后每次暴力判断,时间复杂度为 \(O(n\ log\ log\ n\ T\sqrt{n})\) 或 \(O(n\ T\ \sqrt{n})\).
在这道题已经足以通过了。
但是思考一下,如果将 \(T\) 开到 \(10^8\) 或者更大,这种做法还可行吗?
注意到我们刚才推出的结论,所以我们可以考虑对答案进行预处理。可以考虑枚举素数的 \(k\) 次方来得出答案,计算一下大概最多 \(k=27\),那么预处理的复杂度就大约是 \(O(27 \times \log n)\).接着再 \(O(1)\) 查询,时间复杂度为 \(O(n\ \log\ \log\ n+T)\) 或 \(O(27 \times \log n+T)\).
因为筛法+暴力比较好写,所以这里只给出线性筛+预处理的代码。
这里有一道时限改为 \(2s\) 的加强版,大家可以试试。
-> 加强版链接