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\) 的加强版,大家可以试试。

-> 加强版链接

posted @ 2023-01-14 22:04  Scorilon  阅读(44)  评论(0)    收藏  举报