Trò chơi đổi số

Mình đang bí bài này quá. Bạn nào biết cách làm vui lòng giúp mình nhé. Thanks

bài này khá hay đó, nên dùng đệ qui nhĩ

2 Likes

Đầu tiên là tìm bất biến (invariant) trước :slight_smile: x, y luôn thỏa mãn một điều kiện nào đó.

2 Likes

Gọi (x,y) là ước chung lớn nhất của 2 số nguyên dương x và y, thì: (x,y) = (y,x) = (x+y, x) = (x-y, y). Do đó, điều kiện để K = -1 là (a,b) != (c,d).

Quá trình thực hiện thì gồm 4 bước:

  • Bước 1: sử dụng Euclid algorithm để chuyển (a,b) thành dạng (p, kp) hoặc (kp, p) với p = (a,b).
  • Bước 2: sử dụng Euclid algorithm chuyển tiếp (c,d) thành dạng (p, kp) hoặc (kp, p).
  • Bước 3: loại các bước trùng nhau gần (p, kp). Ví dụ:
    • (a,b) -> (a1, b1) -> (a2, b2) -> … -> (m, n) -> … -> (p, kp)
    • (c,d) -> (c1, d1) -> (c2, d2) -> … -> (m, n) -> … -> (p, kp)
    • Loại các bước từ (m, n) -> … -> (p, kp)
  • Bước 4: Nối (a,b) và (c,d) lại với nhau, trong đó (c,d) đổi ngược thứ tự lại, thành (a,b) -> … -> (p, kp) -> … (c,d).
    • hoặc (a,b) -> … (m,n) -> … -> (c,d)
4 Likes

mình đã làm đc bước 1 và 2 rồi: mình đổi a và b thành ax+by=t, mình tìm x, y và t tương tự cho c và d (t là ước chung lớn nhất của a và b để đảm bảo ax+by = cp+dq=t) nhưng qua bước 3, 4 thì mình chưa biết cách loại và nối các bước lại như thế nào bạn gợi ý chút được không?

Sau khi nghĩ lại thì mình nghĩ cho (a,b) và (c,d) về (t,0) luôn cho tiện. Sau đó so từ (t,0) trở lên.

Bước 3 trở đi là mình đoán thôi, chả biết đúng hay sai cả :v
Thử vài ví dụ:

(20,15) --> (5,15) --> (15,5) --> (10,5) --> (5,5) --> (0,5) --> (5,0)
(25,20) --> (5,20) --> (20,5) --> (15,5) --> (10,5) --> (5,5) --> (0,5) --> (5,0)
==> (20,15) --> (5,15) --> (15,5) --> (20,5) --> (5,20) --> (25,20)
(21,15) --> (6,15) --> (15,6) --> (9,6) --> (3,6) --> (6,3) --> (3,3) --> (0,3) --> (3,0)
(12,9) --> (3,9) --> (9,3) --> (6,3) --> (3,3) --> (0,3) --> (3,0)
==> (21,15) --> (6,15) --> (15,6) --> (9,6) --> (3,6) --> (6,3) --> (9,3) --> (3,9) --> (12,9)
(12,17) --> (17,12) --> (5,12) --> (12,5) --> (7,5) --> (2,5) --> (5,2) --> (3,2) --> (2,1) --> (1,1) --> (0,1) --> (1,0)
(23,19) --> (4,19) --> (19,4) --> (15,4) --> (11,4) --> (7,4) --> (3,4) --> (4,3) --> (1,3) --> (3,1) --> (2,1) --> (1,1) --> (0,1) --> (1,0)
==> (12,17) --> (17,12) --> (5,12) --> (12,5) --> (7,5) --> (2,5) --> (5,2) --> (3,2) --> (2,1) --> (3,1) --> (1,3) --> (4,3) --> (3,4) --> (7,4) --> (11,4) --> (15,4) --> (19,4) --> (4,19) --> (23,19)
3 Likes

xài BFS chạy nổi ko :V

edit: chắc là nổi, x, y <= 1000 thì BFS O(xy) ~ 10^6 là cùng :V

mỗi cặp (x,y) là 1 vertex
1 vertex có tối đa 3 edges tới (y,x), (x-y, y), (x+y,y)
tìm đường ngắn nhất từ vertex (a,b) tới vertex (c,d) thì BFS là ra :V :V

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?