Đếm Tam Giác

Xem dạng PDF

Gửi bài giải

Điểm: 100,00
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M

Tác giả:
Dạng bài

Cho một lưới toạ độ kích thước ~n \times m~. Hãy đếm số bộ ba điểm trên lưới sao cho ba điểm đó tạo thành một tam giác.

Nói cách khác, hãy đếm số tập ba điểm ~A(x_A, y_A)~, ~B(x_B, y_B)~, ~C(x_C, y_C)~ với ~1 \le x_i \le n~, ~1 \le y_i \le m~ sao cho ba điểm không thẳng hàng.

Ba điểm được lấy không kể thứ tự, và hai bộ ba được coi là khác nhau nếu tập ba điểm khác nhau.

Dữ liệu vào

Dòng đầu tiên và duy nhất chứa hai số nguyên ~n~ và ~m~.

Kết quả

In ra số bộ ba điểm tạo thành tam giác.

Ví dụ

Đầu vào:

2 3

Đầu ra:

18

Giải thích: Lưới có ~2 \times 3 = 6~ điểm, cho ~\binom{6}{3} = 20~ bộ ba. Trong đó có ~2~ bộ ba thẳng hàng: ba điểm trên cột ~x = 1~ và ba điểm trên cột ~x = 2~. Vậy đáp án là ~20 - 2 = 18~.

Giới hạn

  • ~1 \le n, m \le 1000~

Lưu ý: đáp án không cần chia dư. Với ~n = m = 1000~ lưới có ~10^6~ điểm và ~\binom{10^6}{3} \approx 1.67 \cdot 10^{17}~, vẫn nằm trong phạm vi số nguyên 64 bit — nhưng chắc chắn tràn số nguyên 32 bit.

Hãy đếm phần bù: lấy tổng số bộ ba trừ đi số bộ ba thẳng hàng.

Một bộ ba thẳng hàng được xác định bởi hai điểm đầu mút cùng một điểm nằm giữa chúng. Với hai điểm cách nhau một vectơ ~(dx, dy)~, số điểm nguyên nằm thực sự giữa chúng đúng bằng ~\gcd(|dx|, |dy|) - 1~.

Vậy hãy lặp qua mọi vectơ ~(dx, dy)~ với ~0 \le dx < n~, ~0 \le dy < m~ (không đồng thời bằng ~0~). Số cặp điểm có vectơ chênh lệch đó là ~(n - dx)(m - dy)~, và phải nhân thêm ~2~ khi cả ~dx~ và ~dy~ đều dương (ứng với hai hướng chéo khác nhau). Toàn bộ chỉ mất ~O(nm)~ phép tính ~\gcd~.


Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.