canuc80k4700·1/21

Hệ số Bézout tối ưu

Nộp bài trên LQDOJ

Bài 47 · Extended Euclidean Algorithm

Cho hai số nguyên dương và . Hãy tìm hệ số Bézout của và chọn cặp tối ưu theo quy tắc của đề. Gọi . Trước hết tối thiểu hóa ; nếu hòa, ưu tiên cặp có , rồi chọn nhỏ hơn.

Input

  • Một dòng chứa và .

Output

  • In theo thứ tự tối ưu đã nêu.

Constraints

Scoring

  • Subtask ( số điểm): các test từ đến , dùng miền dữ liệu nhỏ để có thể đối chiếu độc lập.
  • Subtask ( số điểm): không có giới hạn bổ sung ngoài các ràng buộc đã nêu.

Example

Test 1

Input

35 15

Output

1 -2

Giải thích: Ta có ; trong họ nghiệm, cặp này đạt tổng trị tuyệt đối nhỏ nhất theo quy tắc phân xử.

Lời giải tóm tắt
  • Ý tưởng: Gọi g=gcd(a,b). Thuật toán Euclid mở rộng cho một nghiệm (x0,y0) của a·x+b·y=g. Mọi nghiệm có dạng
  • Ý tưởng: x=x0+(b/g)·t, y=y0-(a/g)·t, với t nguyên.
  • Ý tưởng: Hàm mục tiêu |x|+|y| chỉ có thể đổi chiều tại các vị trí mà x hoặc y đổi dấu. Vì vậy chỉ cần xét các giá trị nguyên của t ở quanh -x0/(b/g) và y0/(a/g), cùng vài lân cận để tránh sai số chia nguyên. So sánh các ứng viên theo thứ tự: tổng trị tuyệt đối nhỏ hơn; nếu hòa, ưu tiên điều kiện x≤y; nếu vẫn hòa, chọn x nhỏ hơn.
  • Ý tưởng: Dùng __int128 khi tính nghiệm và hàm mục tiêu. Độ phức tạp là O(log min(a,b)).