27/07/2023
Làm sao để có câu trả lời hay nhất?
27/07/2023
27/07/2023
Để giải bài toán này, ta có thể sử dụng một mảng cnt để lưu số lượng các ước chung của từng số trong dãy với các số trước nó. Sau đó, ta duyệt từng cặp số trong dãy và kiểm tra xem có tồn tại ước chung lớn hơn 1 hay không. Nếu có, ta tăng biến đếm ans lên 1.
Dưới đây là code giải bài toán này bằng ngôn ngữ C++:
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 105;
int n, a[MAXN], cnt[MAXN], ans;
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
for (int j = 1; j < i; j++) {
int g = gcd(a[i], a[j]);
if (g > 1) ans++;
}
cnt[i] = ans;
}
cout << ans << endl;
return 0;
}
Độ phức tạp của thuật toán này là O(n^2 log M), trong đó M là giá trị lớn nhất trong dãy.
Nếu bạn muốn hỏi bài tập
Các câu hỏi của bạn luôn được giải đáp dưới 10 phút
CÂU HỎI LIÊN QUAN
Top thành viên trả lời