canuc80k6303·4/32

Ma Trận Đảo

Nộp bài trên LQDOJ

Bài 6.4 · Gaussian Elimination

Cho ma trận vuông cấp , các phần tử thuộc trường modulo . Hãy tìm ma trận sao cho

trong đó là ma trận đơn vị. Nếu không tồn tại ma trận như vậy, cần báo rằng không khả nghịch.

Input

  • Dòng đầu chứa số nguyên .
  • Mỗi trong dòng tiếp theo chứa số nguyên. Số thứ trên dòng thứ là .

Output

  • Nếu khả nghịch, in dòng, mỗi dòng số nguyên trong đoạn , tạo thành ma trận . Các số trên cùng một dòng cách nhau bởi một dấu cách.

  • Nếu không khả nghịch, in một dòng No Solution.

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 2
3 5

Output

1000000002 2
3 1000000006

Giải thích: Nhân ma trận đã cho với ma trận được in ra thu được ma trận đơn vị modulo , nên đây chính là nghịch đảo của .

Lời giải tóm tắt
  • Ý tưởng: Ghép ma trận thành [A | I]. Ở cột c, tìm một hàng từ c trở xuống có phần tử khác 0, đổi lên làm pivot, nhân hàng với nghịch đảo modulo của pivot rồi khử cột đó ở mọi hàng khác. Nếu không tìm được pivot thì rank(A)<n, vì vậy nghịch đảo không tồn tại. Khi đủ n pivot, nửa trái trở thành I; mọi phép biến đổi hàng đã tác động đồng thời lên nửa phải nên nửa phải là A^{-1}.
  • Ý tưởng: Modulo 1 000 000 007 là số nguyên tố, do đó nghịch đảo của pivot v≠0 là v^(MOD-2) mod MOD. Thuật toán dùng O(n^3) thời gian và O(n^2) bộ nhớ.