思路:
埃氏筛法+并查集。
实现:
1 class DSU 2 { 3 vector<int> p; 4 public: 5 DSU(int n) 6 { 7 p.resize(n); 8 for (int i = 1; i < n; i++) p[i] = i; 9 } 10 int find(int x) 11 { 12 if (p[x] == x) return x; 13 return p[x] = find(p[x]); 14 } 15 void uni(int x, int y) 16 { 17 x = find(x); y = find(y); 18 if (x != y) p[x] = y; 19 } 20 }; 21 class Solution 22 { 23 public: 24 vector<bool> areConnected(int n, int threshold, vector<vector<int>>& queries) 25 { 26 vector<bool> v(n + 1, false); 27 DSU d(n + 1); 28 for (int i = threshold + 1; i <= n; i++) 29 { 30 if (v[i]) continue; 31 v[i] = true; 32 for (int j = 2 * i; j <= n; j += i) 33 { 34 d.uni(i, j); 35 v[j] = true; 36 } 37 } 38 vector<bool> res; 39 for (auto& q: queries) 40 { 41 if (d.find(q[0]) == d.find(q[1])) res.push_back(true); 42 else res.push_back(false); 43 } 44 return res; 45 } 46 };