Em góp 1 bài cho box Tin đỡ vắng
>-
Đề bài:
Cho n phần tử khác nhau, hỏi có bao nhiêu cách chia n phần tử đó thành k nhóm mà mỗi nhóm có ít nhất 1 phần tử (các hoán vị của các nhóm được xem là 1 cách).
Dữ liệu vào :
Dòng đầu tiên chứa số T là số test.
T dòng tiếp theo mỗi dòng chứa 2 số N và K, với 1<=K<=N<=25
Dữ liệu ra :
T dòng, mỗi dòng là số cách với test tương ứng.
Input:
1
4 2
Output:
7
Giải thích: 7 cách chia đó là (ABC)(D) , (ABD)(C) , (ADC)(B) , (DBC)(A) , (AB)(CD) , (AC)(BD) , (BC)(AD).
Hướng dẫn giải:
Gọi F[i, j] là số cách chia i phần tử vào j nhóm.
Kết quả bài toán sẽ là F[N, K].
Cơ sở QHĐ:
Mã:
F[i, 1] = 1
F[i, i] = 1
Hai điều trên là hiển nhiên
Công thức truy hồi:
Mã:
F[i, j] = F[i - 1, j - 1] + j * F[i - 1, j]
Giải thích CTTH:
Tính F[i, j].
Giả sử đã chia được i - 1 phần tử vào j nhóm, như thế ta chỉ cần thêm 1 phần tử nữa vào một trong những nhóm đã chia thì ta được kết quả. Phần tử cần thêm có thể được thêm vào 1 trong j nhóm đã có. Như vậy công thức sẽ là j * F[i - 1, j].
Giả sử đã chia được i - 1 phần tử vào j - 1 nhóm, như thế ta chỉ cần thêm 1 phần tử nữa vào 1 nhóm mới. Tức là công thức là F[i - 1, j - 1]
Vậy CTTH là F[i - 1, j - 1] + j * F[i - 1, j]
Độ phức tạp: O(N * K)