Descripion
给定 $n\ (1 \leq n \leq 10^5)$ 个正整数 $a_i\ (1 \leq a_i \leq 10^6)$ 。对于每一个数 $a_i$,求有多少个数 $j\ (1 \leq j \leq n)$ 满足 $a_i \mid a_j$ 且 $i \neq j$ 。
Source
Solution
看完题目很容易想到 $O(n^2)$ 的暴力算法,枚举所有 $i$ 和 $j$,显然会超时。但我们发现 $a_i$ 并不大,所以考虑另一种方法。
我们用一个桶 $cnt$ 记录 $a_i$ 出现的次数,$ans_i$ 表示 $a_i=i$ 时的答案,枚举 $i=1 \sim \max \begin{Bmatrix}a_i\end{Bmatrix}$ ,接着枚举 $i$ 以及 $i$ 的倍数,凡是等于 $i$ 或是 $i$ 的倍数的数,答案都应该加上 $i$ 出现的次数。同时因为会把自己算进去,所以答案要减 $1$ 。时间复杂度为 $O(n\log\log n)$,类似 埃拉托斯特尼筛法 。
Code
1 |
|