求解连续数字的正约数集合——倍数法
使用规律递推优化,时间复杂度为 \(\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;
}