Hướng dẫn cho COINS


Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.

Authors: letangphuquy

Xét 4 loại tiền xu có độ dày lần lượt là \(a,b,c,d\). Nếu ta dựng thành chân bàn thì độ cao \(h\) phải là bội của cả \(a,b,c,d\), do đó là bội của \(LCM(a,b,c,d)\).

Xét trường hợp \(a,b,c,d\) là 4 số nguyên tố khác nhau. Khi đó \(LCM(a,b,c,d) = a*b*c*d \le 10^36\) vượt quá giới hạn biểu diễn của số nguyên 64-bit. Vì thế ta cần cài BigNum.

Để thuật toán chạy đủ nhanh ta cần có một số lưu ý như sau :

  • Duyệt trước toàn bộ các bộ \((a,b,c,d)\) trong độ phức tạp \(O(n^4 / 24)\) và lưu LCM vào tập \(S\). Với mỗi truy vấn chỉ cần duyệt lại tập \(S\).
  • Cài bignum bằng vector<int> chứ không phải string : ta xét số trong hệ cơ số \(10^9\).
  • Kết hợp sử dụng số nguyên : Trong trường hợp \(LCM(a,b,c,d) \le 10^{18}\) ta có thể đưa số này vào tập \(T\). Như vậy khi trả lời truy vấn ta sẽ xét tập \(T\) riêng, tập \(S\) riêng nên chỉ cần các phép tính +-*/ có sẵn với số nguyên 64-bit khi tính với các số thuộc tập \(T\) chứ không cần thực hiện các phép toán Bignum với độ phức tạp rất lớn.

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.