关于正解与一种会T的做法的时间复杂度
查看原帖
关于正解与一种会T的做法的时间复杂度
365021
masterhuang楼主2023/11/12 17:00

求 log⁡\log 部分。下面 n←log⁡10n≤105n\gets \log_{10} n\le 10^5

先说正解,就是用 ⌊log⁡10⌋×C\lfloor\log _{10}\rfloor\times C 估计 log⁡10\log_{10},其中 C∼log⁡210C\sim \log _2 10。

然后累加做快速幂判断。此时 ln⁡−exp⁡\ln-\exp 做法不行,于是预处理 22l2^{2^l} 的数,注意一定要记位数保证复杂度,然后直接按二进制顺序乘起来。这样复杂度看似两 log⁡\log,实际仍是 O(nlog⁡n)O(n\log n) 的。

预处理部分:(1×2+2×2+4×2+⋯+2log⁡(n)×2)×log⁡n=O(nlog⁡n)(1\times 2+2\times 2+4\times 2+\dots+2^{\log(n)}\times 2)\times \log n=O(n\log n),其中左边最后的 log⁡\log 是 NTT。

快速幂部分:由于顺序,于是最坏的复杂度为 (1+(1+2)+(1+2+4)+…(1+2+⋯+2log⁡(n)))log⁡n=O(nlog⁡n)(1+(1+2)+(1+2+4)+\dots(1+2+\dots +2^{\log(n)}))\log n=O(n\log n),其中左边最后的 log⁡\log 是 NTT。

这里把估计的与实际的 log⁡10\log_{10} 的差距认为是 O(1)O(1)。


错解部分。

我当时第一想法是倍增,同样预处理 22l2^{2^l},同样记位数,预处理复杂度不变。

计算部分我想倍增,就是相当于把上面快速幂的顺序变成倒序,这样复杂度变成了:

(2log⁡(n)+(2log⁡(n)+2log⁡(n)−1)+(2log⁡(n)+2log⁡(n)−1+2log⁡(n)−2)+…(1+2+⋯+2log⁡(n)))log⁡n=O(nlog⁡2n)(2^{\log(n)}+(2^{\log(n)}+2^{\log(n)-1})+(2^{\log(n)}+2^{\log(n)-1}+2^{\log(n)-2})+\dots(1+2+\dots +2^{\log(n)}))\log n=O(n\log^2 n)

在本题条件下无法通过。于是不能倍增。

2023/11/12 17:00
加载中...