canuc80k5604·5/20

Kiểm Tra Phép Nhân Ma Trận

Nộp bài trên LQDOJ

Bài 56 · Randomized Algorithms

Cho ba ma trận vuông cùng kích thước . Mọi phép tính được thực hiện theo modulo .

Hãy xác định liệu có đúng là tích của và hay không. Nói cách khác, với mọi , cần kiểm tra

Input

  • Dòng đầu chứa số nguyên - kích thước của ba ma trận.
  • dòng tiếp theo mô tả ma trận ; mỗi dòng chứa số nguyên.
  • dòng tiếp theo mô tả ma trận theo cùng định dạng.
  • dòng cuối mô tả ma trận theo cùng định dạng.

Output

  • In YES nếu theo từng phần tử; ngược lại, in NO.

Constraints

  • .
  • .

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

2
1 0
0 1
2 3
4 5
2 3
4 5

Output

YES

Giải thích: Ma trận là ma trận đơn vị, nên ; các phần tử của đúng bằng các phần tử tương ứng của .

Test 2

Input

2
1 1
0 1
1 0
1 1
2 1
1 0

Output

NO

Giải thích: Phần tử ở hàng , cột của tích phải bằng , nhưng phần tử tương ứng của bằng , nên hai ma trận không bằng nhau theo modulo .

Lời giải tóm tắt
  • Ý tưởng: Nhân trực tiếp hai ma trận cần O(n^3) phép toán. Ta dùng kiểm tra Freivalds: chọn một vector ngẫu nhiên r, rồi so sánh
  • Ý tưởng: A · (B · r) và C · r theo modulo M.
  • Ý tưởng: Nếu A·B=C, hai vế bằng nhau với mọi r, nên thuật toán không bao giờ in NO sai. Nếu D=A·B-C khác ma trận không, lấy một hàng khác không của D. Sau khi cố định mọi tọa độ của r trừ một tọa độ có hệ số khác không, phương trình hàng đó của D·r=0 xác định nhiều nhất một giá trị còn lại. Vì mỗi tọa độ được chọn đều trong trường modulo M, xác suất một vòng bỏ sót không quá 1/M.
  • Ý tưởng: Lặp hai vòng độc lập làm xác suất bỏ sót không quá 1/M^2. Mỗi vòng thực hiện ba phép nhân ma trận-vector, nên tốn O(n^2) thời gian và O(n^2) bộ nhớ. Với subtask nhỏ, code tính tích trực tiếp để có kết quả tuyệt đối.