- root 的博客
先先的生日题解
- @ 2024-7-23 14:40:46
如果直接用暴力解法,逐个判断其他的数是不是它的约数,这样时间复杂度是,超时。
假设是的约数的话,那么就是的倍数.因此可以做这么一个处理,当判定某个数字时,我们可以把这个数字的倍数全部加,含义时,的约数又多了一个。
考虑到可能会有很多的值相同,所以可以利用桶的思想,把相同的一次性统计完。
for(int i = 0; i < n; i++)
{
cin >> a[i];
cnt[a[i]] ++;
}
,即有某个出现了,将所有的倍数都加上。
for(int i = 1; i < N; i++)
{
if(cnt[i] == 0) continue;
for(int j = i; j < N; j += i) {
res[j] += cnt[i];
}
}
n + n/2 + n/3 + ... n / n =
时间复杂度是
总结:约数和倍数是一对好基友,当求约数的时间复杂度过大时,可以考虑倍数