ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

求解连续数字的正约数集合——倍数法

求解连续数字的正约数集合——倍数法

求解连续数字的正约数集合——倍数法

使用规律递推优化,时间复杂度为 \(\mathcal{O}(N\log N)\) ,如果不需要详细的输出集合,则直接将 vector 换为普通数组即可(时间更快) 。

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
vector<int> f[N];void divide(int n) {for (int i = 1; i <= n; ++ i)for (int j = 1; j <= n / i; ++ j)f[i * j].push_back(i);for (int i = 1; i <= n; ++ i) {for (auto it : f[i]) cout << it << " ";cout << endl;}
}
int main() {int x; cin >> x; divide(x);return 0;
}

试除法判是否是质数

标准解

\(\mathcal O(\sqrt N)\)

bool is_prime(int n) {if (n < 2) return false;for (int i = 2; i <= x / i; i++) {if (n % i == 0) return false;}return true;
}

常数优化法

常数优化,达到 \(\mathcal O(\frac {\sqrt N}{3})\)

bool is_prime(int n) {if (n < 2) return false;if (n == 2 || n == 3) return true;if (n % 6 != 1 && n % 6 != 5) return false;for (int i = 5, j = n / i; i <= j; i += 6) {if (n % i == 0 || n % (i + 2) == 0) {return false;}}return true;
}
返回列表