Asked Aug 18th, 2024 3:03 a.m. 100 0 2
  • 100 0 2
0

Bội chung nhỏ nhất

Share
  • 100 0 2

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


Answered Aug 20th, 2024 3:17 p.m.
0

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;
}
Share
Avatar Vật Lý @helooo1
Aug 21st, 2024 2:45 p.m.

@thangtd90 cách làm của bạn ko chạy đc với 100 số nguyên

0
| Reply
Share
Answered Sep 21st, 2024 4:19 a.m.
0

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ẻ!

Share
Viblo
Let's register a Viblo Account to get more interesting posts.