Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Hướng giải: Với mỗi thao tác, ta đếm số các số thuộc tập nguyên tố cùng nhau với rồi cập nhật đáp án.
Subtask 1
Ta dùng cấu trúc dữ liệu unordered_multiset
của C++
để biểu diễn tập .
Với mỗi thao tác, duyệt qua từng số thuộc tập rồi kiểm tra số đó có nguyên tố cùng nhau với không.
Độ phức tạp:
Subtask 2
Phân tích thành thừa số nguyên tố: =
Theo nguyên lí bao hàm - loại trừ, số các số thuộc tập nguyên tố cùng nhau với là:
+ Số các số thuộc tập
- Số các số thuộc tập chia hết cho
- Số các số thuộc tập chia hết cho
- Số các số thuộc tập chia hết cho
...
+ Số các số thuộc tập chia hết cho và
+ Số các số thuộc tập S chia hết cho và
+ Số các số thuộc tập chia hết cho và
...
Vì nên có tối đa ước số nguyên tố khác nhau (chứng minh bằng cách tính tích ). Ta dùng bitmask để tính giá trị trên trong .
Gọi là số các số thuộc tập chia hết cho . Vì ta chỉ quan tâm đến các giá trị không có ước chính phương khác nên ta không cần duyệt qua tất cả các ước của để cập nhật . Ta cập nhật ngay trong lúc duyệt bitmask.
Chi tiết cách cài đặt các bạn có thể xem code mẫu.
Độ phức tạp:
Đọc thêm về nguyên lí bao hàm - loại trừ tại https://cp-algorithms.com/combinatorics/inclusion-exclusion.html
Comments