Bội chung nhỏ nhất
Cho một tập hợp gồm n số nguyên dương. Bạn cần tính tổng của bội chung nhỏ nhất của tất cả các tập hợp con của tập hợp ban đầu (trừ tập hợp rỗng).
Vì đáp số có thể rất lớn nên hãy in ra kết quả theo modulo 10007.
Input
- Dòng đầu tiên gồm số lượng bộ test T (T <= 100).
- Mỗi bộ test bao gồm số nguyên dương n (1 <= n <= 100), là số lượng phần tử của dãy số.
- Dòng tiếp theo gồm n số a_i (1 <= a_i <= 500).
Output
- Với mỗi test, in ra số thứ tự của test (Case ...) và đáp số của bài toán.
Example
Input:
2
3
3 4 5
2
2 7
Output:
Case 1: 119
Case 2: 23
2 ANSWERS
Bạn thử tham khảo đoạn code sau nhé
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// Hàm tính UCLN (gcd) của 2 số
int gcd(int a, int b) {
while (b != 0) {
int t = b;
b = a % b;
a = t;
}
return a;
}
// Hàm tính BCNN (lcm) của 2 số
int lcm(int a, int b) {
return (a / gcd(a, b)) * b;
}
int main() {
const int MOD = 10007;
int T;
cin >> T;
vector<int> results(T); // Dùng để lưu kết quả của tất cả các test case
for (int t = 0; t < T; t++) {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
// Khởi tạo biến để lưu tổng BCNN của các tập con
int totalLCM = 0;
// Duyệt qua tất cả các tập con
// Sử dụng bitmask để xét tất cả các tập con
for (int mask = 1; mask < (1 << n); mask++) {
int currentLCM = 1;
bool first = true;
for (int i = 0; i < n; i++) {
if (mask & (1 << i)) {
if (first) {
currentLCM = a[i];
first = false;
} else {
currentLCM = lcm(currentLCM, a[i]);
}
}
}
// Cộng BCNN của tập con này vào tổng
totalLCM = (totalLCM + currentLCM) % MOD;
}
// Lưu kết quả cho bộ test hiện tại
results[t] = totalLCM;
}
// In ra toàn bộ kết quả sau khi đã xử lý tất cả các test case
for (int t = 0; t < T; t++) {
cout << "Case " << t + 1 << ": " << results[t] << endl;
}
return 0;
}
@thangtd90 cách làm của bạn ko chạy đc với 100 số nguyên
Chào bạn! Đừng lo lắng về bài toán Bội Chung Nhỏ Nhất phức tạp này, mình sẽ giúp bạn "xử lý" nó một cách nhẹ nhàng thôi.
Gợi ý:
Để giải quyết bài toán này, bạn có thể sử dụng thư viện GCD (Greatest Common Divisor - Ước chung lớn nhất) và LCM (Least Common Multiple - Bội chung nhỏ nhất). Hầu hết các ngôn ngữ lập trình phổ biến đều có thư viện hỗ trợ tính toán ƯCLN và BCNN.
Hãy nhớ sử dụng các hàm liên quan đến Ước chung lớn nhất và Bội chung nhỏ nhất và duyệt qua tất cả các tập con (trừ tập rỗng) của tập hợp ban đầu.
Ví dụ:
Trong Python, bạn có thể sử dụng hàm math.gcd()
để tính ƯCLN và tính BCNN dựa trên công thức: lcm(a, b) = (a * b) // gcd(a, b)
.
Lưu ý: Đừng quên xử lý modulo 10007 để tránh tràn số!
Hy vọng những gợi ý này giúp ích cho bạn. Chúc bạn "code" vui vẻ!