만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

이진 행렬

시간 제한0.5초메모리 제한512 MB

요약
n×n 이진 행렬 K가 주어질 때, 앞선 거듭제곱 K^m과 같아지는 가장 작은 지수 k를 구합니다. 각 원소는 2로 나눈 나머지로 계산합니다.
난이도

보통10점 중 5점

유형
행렬, 수학, 시뮬레이션
정답자
아직 제출이 없습니다

문제

키파는 율이에게서 0과 1로 채워진 n × n 표를 선물로 받았습니다. 키파는 이 표를 행렬로 보고 KK라는 이름을 붙였습니다. KK의 각 성분이 0 또는 1이라는 점이 마음에 든 키파는, 계산 결과의 각 성분도 짝수이면 0, 홀수이면 1로 적기로 했습니다.

먼저 덧셈으로 KK, K+KK+K, K+K+KK+K+K를 계산해 보았지만, K+KK+K의 모든 성분이 0이라 금방 싫증이 났습니다. 그래서 곱셈을 해 보기로 했습니다. KK, K2K^2, K3K^3, ...을 계산하던 키파는 어느 순간 같은 계산을 반복하고 있다는 것을 알아챘습니다.

같은 계산을 반복하는 일은 컴퓨터가 해야 한다고 생각한 키파는, KK로 곱셈을 하다가 언제 싫증이 날지 궁금해졌습니다. 키파가 예전 계산 결과를 다시 보게 될 때, 그 곱셈 식에 KK가 몇 번 곱해져 있는지 출력하는 프로그램을 작성해 주세요.

입력

첫째 줄에 행렬의 크기 nn이 주어집니다.

둘째 줄부터 nn개의 줄에 공백으로 구분된 nn개의 수가 주어집니다. 모든 수는 0 또는 1입니다.

출력

키파가 예전 계산 결과를 다시 보게 될 때, 그 곱셈 식에 곱해진 KK의 개수를 출력합니다.

힌트

수학적으로 엄밀하게 말하면, 행렬 KK가 주어졌을 때 자연수 집합의 부분집합

{n:∃m,1≤m<n and Km=Kn}\{n : \exists m, 1 \le m < n \text{ and } K^m = K^n\}

의 최소 원소를 출력하는 문제입니다.

예제2

  1. 예제 1

    입력
    4
    0 1 1 1
    1 0 1 1
    0 0 0 1
    0 1 0 0
    
    예상 출력
    5
    
  2. 예제 2

    입력
    16
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 1 1 1 0 1 0 1 1 1 1 1 0 1 0 0
    0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0
    0 1 1 1 0 1 0 0 1 0 1 0 0 1 1 0
    0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0
    0 1 1 0 0 1 0 1 1 1 1 1 0 1 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0
    0 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0
    0 1 0 1 0 1 0 1 0 0 0 1 0 0 0 0
    0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0
    0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0
    0 1 0 0 0 0 1 0 1 1 1 1 1 1 1 0
    0 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0
    0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
    
    예상 출력
    514