Thông tin
Thời gian: 21:00 - 23:30 ngày 24/02/2025
Contest: TẠI ĐÂY
Chuẩn bị bởi team Logica, thuộc khuôn khổ dự án The Algitect (ALGI Project)
Tại một triển lãm nghệ thuật, có phòng trưng bày xếp thành một vòng tròn, được đánh số từ đến . Mỗi phòng cần có chính xác khách tham quan. Chỉ được mở cửa một phòng duy nhất để khách tiến vào, sau đó đi đến các phòng khác theo chiều kim đồng hồ.
Yêu cầu: Tìm căn phòng mà anh Tèo cần mở cửa vào để tổng khoảng cách di chuyển của các vị khách là nhỏ nhất. Nếu có nhiều hơn một căn phòng như vậy, tìm căn phòng có số hiẹu nhỏ nhất
Dữ liệu bảo đảm:
Subtasks:
Thử chọn từng căn phòng để mở cửa, sau đó duyệt qua tất cả những phòng còn lại và tính tổng khoảng cách để vị khách có thể đến được căn phòng bằng một vòng lặp.
Độ phức tạp thời gian: .
Ý tưởng tương tự với subtask trước, nhưng cải tiến bước tính tổng khoảng cách để vị khách có thể đến được căn phòng bằng cách sử dụng công thức:
Độ phức tạp thời gian:
Quan sát và nhận xét
Giả sử ta mở cửa phòng , ta có khoảng cách để đến các phòng còn lại như sau:
Vẫn lấy điểm làm mốc, khi ta mở cửa ở phòng , dễ thấy biểu thức tính khoảng cách thay đổi thành:
Khi ta thay đổi việc mở cửa ở phòng hiện tại (tạm gọi là ), để mở phòng tiếp theo theo chiều kim đồng hồ (tạm gọi là ):
Như vậy, để giải bài toán trên, ta tính trước đáp án nếu mở cửa ở phòng . Sau đó duyệt đến và thay đổi đáp án ở từng bước duyệt như đã giải thích ở trên.
Độ phức tạp thời gian: .
Tí tấn công Quái Vật Giai thừa lần. Vào lần thứ , Tí cần tìm số nguyên không âm lớn nhất để dựng lên một hàng rào phép thuật có sức mạnh sao cho là ước của
Giải thích:
Mô hình hóa bài toán: Cho truy vấn và giá trị , mỗi truy vấn cho , tìm số nguyên không âm lớn nhất thỏa
Dữ liệu bảo đảm: .
Subtasks:
Vì , do đó tối đa có thể đạt đến khoảng , có thể lưu trữ được trong kiểu dữ liệu long long.
Như vậy, ta tính và duyệt tăng dần để tìm đáp án.
Độ phức tạp thời gian: .
Với , việc tính trực tiếp như subtask trước là không khả thi.
Kiến thức toán học cần biết
Giả sử với là các thừa số nguyên tố của .
Khi đó, một số chia hết cho khi và chỉ khi với mọi thừa số nguyên tố của thì số cũng nhận làm thừa số nguyên tố trong đó .
Ví dụ, xét:
chia hết cho vì:
- Với thừa số nguyên tố , khi phân tích số và ta được số mũ .
- Với thừa số nguyên tố , khi phân tích số và ta được số mũ
Lưu là số mũ của thừa số nguyên tố trong phân tích thừa số nguyên tốt của
Xét , có thể phân tích thừa số nguyên tố bằng cách duyệt qua mọi số từ đến và phân tích thừa số nguyên tố của . Sau đó phân tích thừa số nguyên tố của .
Cuối cùng, ta xét mọi thừa số nguyên tố của , gọi:
Kết quả: Giá trị nhỏ nhất của .
Độ phức tạp thời gian: .
Tổng với từ đến (phân tích thừa số nguyên tố của ).
Ý tưởng kế thừa từ subtask trước, tuy nhiên cần cải tiến khâu phân tích thừa số nguyên tố của và khâu phân tích thừa số nguyên tố của
Quan sát và nhận xét
Xét và số nguyên tố . Từ đến có:
Khi đó ta nói có:
Như vậy, có thể tính nhanh số mũ của một số nguyên tố bất kỳ trong phân tích thừa số nguyên tố của bằng cách:
Và tính tổng số lượng số ở tất cả các bậc.
Công thức
Số lượng thừa số nguyên tố bậc trong phân tích thừa số nguyên tố của là:
Nhận thấy trong subtask này, số lượng lớn, lên đến , do đó cần một thuật toán để phân tích thừa số nguyên tố số trong .
Một cách đó là sàng ước nguyên tố. Ở đây, lưu là thừa số nguyên tố nhỏ nhất của . Khi đó, ta có thể phân tích số bất kì thành thừa số nguyên tố trong vì:
Tip
Cách xây dựng mảng dựa trên sàng số nguyên tố Erastosthenes.
Ta duyệt từ đến giá trị tối đa, nếu với là số nguyên tốt chưa được gán giá trị, chắc chắn và bội của sẽ nhận là thừa số nguyên tốt nhỏ nhất.
Giả sử ta sàng tới , độ phức tạp thời gian là .
Độ phức tạp thời gian:
Có một chiếc bánh đã được chia sẵn thành phần đều nhau. Tiếp tục chia tất cả các phần bánh đó ra, mỗi phần thành phần nhỏ hơn, tổng cộng lần. Chia đều số lượng phần bánh cho thực khách, sẽ có một lượng bánh dư ra là .
Yêu cầu: Tính .
Mô hình hóa bài toán: Sau lần cắt, ta được số phần bánh là:
Bài toán yêu cầu tính .
Dữ liệu bảo đảm: .
Subtasks:
Vì , có thể tính đáp án bằng cách duyệt và nhân thêm vào kết quả lần.
Caution
Lưu ý: Kết quả của phép tính trên là rất lớn, do đó cần lồng phép tính chia dư vào quá trình tính đáp án, chứ không thể tính xong rồi mới chia dư cho . Ta có tính chất
Độ phức tạp thời gian: .
Với lên đến , thí sinh bắt buộc phải sử dụng thuật toán kinh điển liên quan tới lũy thừa, đó là lũy thừa nhị phân.
Độ phức tạp thời gian:
Chú ý
Giới hạn đồng nghĩa với việc, trong bất kỳ phép tính nào, các giá trị luôn có thể lên đến vì:
Trong thuật toán lũy thừa nhị phân, cốt lõi là chia một lũy thừa ra làm hai nửa và nhân lại với nhau. Vì vẫn còn tồn tại phép nhân, phép tính có thể trả về một số lên đến , hoàn toàn vượt ngoài phạm vi của long long.
Tip
Có thể áp dụng tư tưởng chia để trị như với phép lũy thừa
Độ phức tạp thời gian: .
Khoa đang thực hiện chuyển nhà và anh sẽ đặt các món đồ của mình vào một chiếc balo với sức chứa . Nếu bỏ quá nhiều đồ vào ba lô, khiến tổng trọng lượng đạt tới thì ba lô vẫn có thể chứa được, nhưng các món đồ bên trong sẽ phải chịu một áp lực do quá tải, chính xác là .
Khoa có món đồ, món đồ thứ có khối lượng , giá trị , nhưng chỉ có thể chịu được một mức áp lực tối đa là . Nếu áp lực trong ba lô lớn hơn khả năng chịu đựng của món đồ nào đó, nó sẽ bị hỏng!
Yêu cầu: Tìm cách để Khoa lấy được tổng giá trị lớn nhất mà vẫn đảm bảo không món đồ nào bị hỏng.
Dữ liệu bảo đảm:
Subtasks:
Quay lui thử tất cả các cách chọn.
Độ phức tạp thời gian: .
Cố định mức áp lực mà balo phải chịu là , dễ thấy chỉ có thể bỏ các món đồ với vào balo.
Như vậy, với từ đến , bài toán trở thành bài toán quy hoạch động điển hình:
Bỏ một số vật phẩm vào balo với giới hạn khối lượng là sao cho tổng giá trị là lớn nhất có thể.
Đặt trạng thái là tổng giá trị lớn nhất có thể lấy được khi xét món đồ đầu tiên, với tổng khối lượng là .
Có hai trường hợp chuyển trạng thái như sau:
Giải bài toán trên với mọi giá trị , sau đó lấy đáp án lớn nhất, đó chính là kết quả của bài toán chung.
Độ phức tạp thời gian: với .
Vấn đề cốt lõi của bài toán này vẫn là việc áp lực của balo bất định. Nếu giải quyết được vấn đề này, bài toán sẽ được đơn giản hóa thành bài toán điển hình.
Cách làm ở subtask trước là không khả thi khi giới hạn dữ liệu lớn.
Cách làm tối ưu là sort lại các món đồ theo giảm dần. Khi đó, xét đến món đồ thứ , rõ ràng là nhỏ nhất trong món đồ đầu tiên, do đó tất cả vật này đều có thể chịu được áp lực lên đến ,. Nghĩa là trong trạng thái có thể duyệt từ đến .
Độ phức tạp thời gian: .