线性筛的作用就是为了保证每个合数都只被其【最小的】那个质因数标记一次。
这个讲的有点复杂了,最后是关键,就是每个数只会以唯一方式被标记。
| // teamname: Gospel_rock | |
| /** | |
| * Problem: ${PROBLEM_NAME} | |
| * Contest: ${PROBLEM_GROUP_NAME} | |
| * Judge: ${ONLINE_JUDGE_NAME} | |
| * URL: ${PROBLEM_URL} | |
| * Created: 2026-04-15 18:55:49 | |
| * Author: Gospel_rock | |
| * My blog: https://znzryb.com/ | |
| * |
| #ifdef LOCAL | |
| template<typename T> void _dbg_print(T x) { cerr << x; } | |
| void _dbg_print(bool x) { cerr << (x ? "T" : "F"); } | |
| void _dbg_print(string x) { cerr << '"' << x << '"'; } | |
| template<typename T> void _dbg_print(vector<T> v) { int n = v.size(); cerr << "["; for (int i = 0; i < n; i++) { if (i) cerr << ", "; _dbg_print(v[i]); } cerr << "]"; } | |
| template<typename T> void _dbg_print(set<T> s) { cerr << "{"; int f = 0; for (auto x : s) { if (f++) cerr << ", "; _dbg_print(x); } cerr << "}"; } | |
| template<typename T, typename U> void _dbg_print(pair<T, U> p) { cerr << "("; _dbg_print(p.first); cerr << ", "; _dbg_print(p.second); cerr << ")"; } | |
| template<typename T, typename U> void _dbg_print(map<T, U> m) { cerr << "{"; int f = 0; for (auto& [k, v] : m) { if (f++) cerr << ", "; _dbg_print(k); cerr << ": "; _dbg_print(v); } cerr << "}"; } | |
| void _dbg() { cerr << endl; } | |
| template<typename T, typename... A> void _dbg(T x, A... a) { _dbg_print(x); if (sizeof...(a)) cerr << ", "; _dbg(a...); } |
| /* | |
| "/Users/zzy/Desktop/DoProblemAsMyTaste/HDU/2026 杭电春季联赛 4/cmake-build-release/st_func_bench" | |
| 场景:ST 表存下标,合并时引用外部数组 w 做 argmax | |
| N = 1000000, Q = 5000000 | |
| Build(ms) Query(ms) | |
| A: std::function (lambda&) 53.46 40.59 | |
| B: custom functor (ref w) 43.16 20.65 | |
| C: raw hardcoded 40.90 20.37 |