算法一
直接模拟就好了。 时间复杂度:\(O(n^2 \log n)\). 实际得分:\(30pts\).
算法二
注意到 \(O(n^2 \log n)\) 无法通过了。但是,我们可以计算出 \(n = 7000\) 的答案为 \(275797760\). 然后,对于 \(7001\) ~ \(n\) 区间的答案,实际上就是 两倍的该区间与 \(1 \leq i \leq 7000\) 的两两 \(\gcd\) 之和,再加上自己和自己区间答案。 ??? 就比方说,\(a\) 和 \(b\) 表示区间,定义 \(a \times b\) 为 \(a\) 区间与 \(b\) 区间两两 \(\gcd\) 和。那么,\(x = a b\),则 \(x^2 = (a b)^2 = a^2 2 \times a \times b b^2\). 而 \(a^2\) 的答案被提前算出,然后 \(b^2\) 区间长度 \(\leq 100\) 结束,\(a \times b\) 计算也只需要 \(7000 \times 100 = 7 \times 10^5\) 再加个 \(\log\) 的时间,过了。 时间复杂度:\(O(\text{wys})\). 实际得分:\(60pts\).
算法三显然本题可以用 \(\phi\) 过,但是我们用 莫比乌斯反演!
对,下面是推式子时间。 \[\sum_{i=1}^n \sum_{j=1}^n \gcd(i,j) \] \[= \sum_{d=1}^n d \sum_{i=1}^n \sum_{j=1}^n [\gcd(i,j)==d] \] \[= \sum_{d=1}^n d \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{d} \rfloor} [\gcd(i,j)==1] \] \[= \sum_{d=1}^n d \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{k|\gcd(i,j)} \mu_k \] \[= \sum_{d=1}^n d \sum_{k=1}^n \lfloor \frac{n}{T} \rfloor^2 \mu_k (T = d \times k) \] \[= \sum_{T=1}^n \sum_{d|T} d \times \mu_\frac{T}{d} \lfloor \frac{n}{T} \rfloor^2 \] \[= \sum_{T=1}^n \phi(T) \lfloor \frac{n}{T} \rfloor^2 \] 每一步都是运用了 \(\mu\) 的基本性质,对最后一步的操作讲解一下: 你发现 \(\sum_{d|T} d \times \mu_{\frac{T}{d}}\) 这玩意儿很像 \(Id * \mu\),然后就是了,而 \(Id * \mu = \phi\),是不是很神奇? 实际上是一个隐蔽的性质 推式子的基本要点总结:
本题到了 \(\sum_{T=1}^n \phi(T) \lfloor \frac{n}{T} \rfloor^2\) 这步,直接枚举即可通过了。 时间复杂度:\(O(n)\). 实际得分:\(100pts\). 算法四考虑推式子之后一个加强。 题意基本不变,改范围为:
显然 \(O(n \times T)\) 过不了。 考虑 \(\lfloor \frac{n}{T} \rfloor^2\) 可以整除分块,然后 \(\phi\) 可以预处理做前缀和。 这样可以单组询问 \(O(\sqrt{n})\),预处理 \(O(n)\). 此处应当有掌声! 时间复杂度:\(O(n T \sqrt{n})\). 实际得分:\(100pts\).
附:本题没有取模,这是令人惊讶的一点——一般的大式子都要取模的。为什么呢? 因为,\(n=10^5\) 时答案才 \(72434344904\),而答案总不会超过 \(n^3\) (每个 \(\gcd \leq n\) 哇,非常粗略的估算)。 \(n=10^6 \rightarrow ans = 8643257847824\). \(n=10^7 \rightarrow ans = 1004297420038032\). 看到了吧,我们的估计大的多了,\(\text{long long}\) 没有问题的。 来源:https://www./content-4-686351.html |
|