canuc80k1819·20/50

Đếm Hành Trình Đúng K Cạnh

Nộp bài trên LQDOJ

Bài 18 · Matrix Multiplication

Cho đồ thị có hướng đơn. Hãy đếm tổng số walk có đúng cạnh, với đỉnh đầu và đỉnh cuối tùy ý; một walk được phép đi qua lại cùng đỉnh hoặc cạnh nhiều lần.

Input

  • Dòng đầu chứa ba số nguyên .
  • Mỗi trong dòng tiếp theo chứa một cạnh có hướng , nghĩa là đi từ đến .

Output

  • In tổng số walk có đúng cạnh, lấy modulo .

Constraints

  • .
  • ().
  • .
  • Không có cạnh tự khép và không có hai cạnh trùng cùng hướng.

Scoring

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

Example

Test 1

Input

2 2 3
1 2
2 1

Output

2

Giải thích: Từ mỗi đỉnh có đúng một walk dài ba cạnh trong chu trình hai đỉnh, nên tổng cộng có walk.

Lời giải tóm tắt
  • Phân tích: Với ma trận kề A, phần tử (u,v) của A^r biểu diễn số walk dài r từ u đến v.
  • Thuật toán: Tính A^k bằng lũy thừa nhị phân, rồi cộng mọi phần tử của ma trận kết quả.
  • Chứng minh tính đúng đắn: Cơ sở r=1 đúng theo định nghĩa ma trận kề. Trong phép nhân, tổng Σ_x A^r[u][x]·A[x][v] phân loại mỗi walk dài r+1 theo đỉnh áp chót x, nên không thiếu và không trùng. Do mỗi walk có duy nhất cặp đầu-cuối, tổng mọi phần tử đếm đúng toàn bộ walk cần tìm.
  • Độ phức tạp: Thời gian O(n^3 log k); bộ nhớ O(n^2).