第四题:
int gcd(int a, int b) {
    if (a < b)
        swap(a, b);
    if (a % b == 0)
        return b;
    else
        return gcd(b, a % b);
}

int main() {
    int n;
    cin >> n;
    vector<int> candy(n);
    for (int i = 0; i < n; i++)
        cin >> candy[i];
    vector<vector<int>> neigh(n);
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (gcd(candy[i], candy[j]) > 1) {
                neigh[i].push_back(j);
                neigh[j].push_back(i);
            }
        }
    }
    vector<bool> flag(n, false);
    int res = 0;
    for (int i = 0; i < n; i++) {
        if (flag[i] == false) {
            int sum = 0;
            queue<int> q;
            q.push(i);
            flag[i] = true;
            while (!q.empty()) {
                int cur = q.front();
                sum++;
                q.pop();
                for (int j = 0; j < neigh[cur].size(); j++) {
                    if (flag[neigh[cur][j]] == false) {
                        q.push(neigh[cur][j]);
                        flag[neigh[cur][j]] = true;
                    }
                }
            }
            res = max(res, sum);
        }
    }
    cout << res << endl;
    system("pause");
    return 0;
}