문제 링크
- http://icpc.me/13165
사용 알고리즘
- 랜덤
시간복잡도
- $O(N^2M)$
풀이
두 정사각행렬 $A, B$와 두 행렬을 곱한 결과 $C$가 주어졌을 때 곱셈이 올바르게 수행되었는지 $O(N^2)$ 랜덤 알고리즘은 잘 알려져 있습니다. 알고리즘을 간단하게 요약하자면, 랜덤한 $N\times 1$ 행렬 $V$를 만들어서 $A\times (BV) = CV$인지 확인하면 곱셈을 올바르게 수행했는지 높은 확률로 판별할 수 있습니다.
Freivalds’ Algorithm을 알고 있다면, 이 문제는 간단한 그리디로 해결할 수 있는 스케줄링 문제로 바뀌게 됩니다.
$N\times N$행렬과 $N\times 1$행렬을 곱하는 부분을 조금 신경써서 구현하면 컴파일러가 SIMD로 최적화를 해주기 때문에 매우 빠르게 동작합니다. 자세한 구현은 아래 코드를 참고해주세요.
전체 코드
1 |
|