Skip to content

DTQG #6 Editorial

29 Nov 2023

Bài 1

chia hết cho hoặc .

Điều kiện trên tương đương với:

  • chia hết cho .
  • Hoặc, chia hết cho .

Nếu đếm mỗi trường hợp rồi cộng vào thì sẽ thừa những phần tử trùng nhau ở cả trường hợp. Lúc này bù trừ rất là khó. Ta sẽ không đếm riêng như vậy.

Ta cố định phần tử . Lúc đó ta duy trì một mảng số cặp phần tử thoả mãn . Khi tăng lên thì ta biết sẽ kết nạp thêm các phần tử có giá trị , ta chỉ việc duyệt các giá trị có thể của và cập nhật mảng trên.

Sau khi cố định phần tử và cập nhật được mảng như trên, ta duyệt giá trị từ trở đi để tính. Nếu thoả mãn chia hết cho hoặc thoả mãn thì ta biết được số bộ ba cho ra giá trị . Giả sử có bộ. Lúc này nhân vào đáp án . Chú ý có sử dụng phép luỹ thừa nhanh để tính.

Bài này hay ở chỗ, cái giá trị của mình chứa , điều kiện cũng chứa nên mình có thể nghĩ đến việc nhóm chúng vào.

Bài 2

Những bài đếm bộ có thì ta thường nghĩ đến cách bao hàm loại trừ quen thuộc. Gọi là số cách chọn ra bộ ba có chia hết cho . Gọi là số cách chọn ra bộ ba có . Ta sẽ lấy trừ đi để ra .

Vấn đề là đi tính nhanh. Ta thấy gcd của một bộ ba chỉ ảnh hưởng bởi thằng min và max. Do đó ta có thể duyệt min và max, kiểm tra xem min và max có chia hết cho không và cộng vào số lượng thằng ở giữa min và max. Cách làm vừa rồi sẽ tốn .

Nhận xét tiếp theo là ta chỉ duyệt min và max chia hết cho . Tuy vậy thời gian chạy trong trường hợp vẫn là . Nhưng ta nhận thấy là số lượng thằng ở giữa min và max có thể dùng tổng tiền tố để tính nhanh. Thật vậy, gọi min = , max = , mảng tổng tiền số số lượng là , thì ta sẽ lấy . Nếu cố định , ta sẽ có là các giá trị max có thể. Lúc đó ta chỉ cần lưu tổng vào một biến để tính nhanh.

Độ phức tạp chỉ là vì ta duyệt như sàng nguyên tố.

Bài 3

Chứng minh đáp án tối thiểu là và tối đa là với là số lượng phần tử . Thật vậy, các phần tử bằng ta phải tăng lên ít nhất để chúng có bit bật đáp án tối thiểu là . Mặt khác, ta có thể chứng minh luôn xây dựng được đồ thị liên thông qua tối đa phép nữa:

  • Xét số có vị trí của bit thấp nhất là cao nhất. Nếu là duy nhất thì ta chỉ việc lấy là sẽ bật các bit ở sau . Lúc đó tất cả các đỉnh khác đều có cạnh đến đỉnh này.
  • Nếu không phải duy nhất, mà tồn tại cũng có bit thấp nhất là . Thì sẽ có thể không liên thông với . Ta chỉ cần thêm một phép là .

Vậy chỉ cần tối đa thêm phép. Ta sẽ đi check có dùng phép được không, có dùng phép được không. Nếu không thể thì in ra là được.