Người Gửi: Dương Lee
- Problem:
Một đoạn số có tổng bằng nhau trong một dãy số là một nhóm các số theo đúng thứ tự ban đầu trong dãy mà nếu nhóm với nhau thì sẽ cho ra cùng một giá trị tổng. Ví dụ với dãy: 2 5 1 3 3 7 thì ta có thể nhóm thành: (2 5) (1 3 3) (7) cùng cho giá trị tổng là 7.
Chú ý: đoạn đặc biệt chứa tất cả các phần tử của dãy cũng được coi là một đoạn có tổng bằng nhau với chính giá trị tổng các số của dãy đó.
Yêu cầu: viết chương trình nhận vào các dãy số nguyên dương và trả về giá trị tổng nhỏ nhất có thể của một đoạn tổng bằng nhau trong dãy.
Input
Dòng đầu tiên chứa một số nguyên 1 ≤ t ≤ 1000 là số lượng bộ test. Mỗi bộ test bao gồm:
Dòng đầu tiên chứa thứ tự bộ test và số M (1≤ M ≤ 10000) là số phần tử của dãy. Các dòng tiếp theo mỗi dòng ghi 10 số của dãy phân cách bởi 1 dấu cách.
Dòng cuối cùng có thể có ít hơn 10 số. (Các số trong dãy đều nhỏ hơn 20000).
Output
Với mỗi bộ test, in ra trên một dòng gồm số thứ tự bộ test và tổng nhỏ nhất có thể đạt được của các đoạn số có tổng bằng nhau.
Example:
Input
3
1 6
2 5 1 3 3 7
2 6
1 2 3 4 5 6
3 20
1 1 2 1 1 2 1 1 2 1
1 2 1 1 2 1 1 2 1 1
Output:
1 7
2 21
3 2
- Solution:
Bài này có dính líu một chút tới QHĐ khi bạn tính trước tổng S của mảng như code dưới đây (hoặc không cần vậy cũng được).
- Vì dãy thỏa mãn tính chất có các đoạn tổng bằng nhau nên các ước của tổng dãy là số lượng đoạn hoặc tổng từng đoạn
- Tìm các ước rồi sắp xếp nó.
- Duyệt từng ước xem dãy thỏa mãn ước nào thì in và reuturn chương trình.
(code dưới đây sử dụng các chức năng có sẵn trong thư viện)