Editorial for COPRIME - Thao tác trên tập S


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 S nguyên tố cùng nhau với x 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 S. Với mỗi thao tác, duyệt qua từng số thuộc tập S rồi kiểm tra số đó có nguyên tố cùng nhau với x không.

Độ phức tạp: O(q2)

Subtask 2

Phân tích x thành thừa số nguyên tố: x = p1a1p2a2...pnan

Theo nguyên lí bao hàm - loại trừ1, số các số thuộc tập S nguyên tố cùng nhau với x là:

+ Số các số thuộc tập S

- Số các số thuộc tập S chia hết cho p1

- Số các số thuộc tập S chia hết cho p2

- Số các số thuộc tập S chia hết cho p3

...

+ Số các số thuộc tập S chia hết cho p1p2

+ Số các số thuộc tập S chia hết cho p1p3

+ Số các số thuộc tập S chia hết cho p2p3

...

x106 nên x có tối đa 8 ước số nguyên tố khác nhau (chứng minh bằng cách tính tích 235·...). Ta dùng bitmask để tính giá trị trên trong O(28).

Gọi cnt[k] là số các số thuộc tập S chia hết cho k. Vì ta chỉ quan tâm đến các giá trị k không có ước chính phương khác 1 nên ta không cần duyệt qua tất cả các ước của x để cập nhật cnt. Ta cập nhật cnt 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: O(qMAXX+q28)

1Đọc thêm về nguyên lí bao hàm - loại trừ tại https://cp-algorithms.com/combinatorics/inclusion-exclusion.html


Comments

Please read the guidelines before commenting.


There are no comments at the moment.