swj0324   1년 전

n의 최대 입력값이 10^18 <= 2^60 이고, m의 최대 입력값이 100이면

분할 정복을 이용한 matrix_pow에서 mul 이 호출될 수 있는 최대 횟수는 

대략 n이 이진수로 11......11인 경우 120번 정도이고 

mul 한번 호출당 100^3 = 10^6 이니까

120 * 백만 = 1.2억 이니 

제한 시간 3초안에 돌아가야 하는것 아닌가요?

제가 뭘 간과 했을까요...?

djm03178   1년 전

mod를 const로 선언해주면 통과합니다.

이유는 나누기 연산은 프로세서가 처리하는 모든 연산 중 가장 느린 것에 속하기 때문입니다. mod가 const가 아닌 경우, 컴파일러는 그 느린 나누기 명령을 그대로 수행하도록 코드를 만들 수밖에 없습니다. 하지만 const로 선언된 경우, 컴파일러는 나누기 명령을 만들어내는 대신 같은 결과를 내는 다른 연산(비트 연산이나 덧셈, 곱셈 등)들을 조합하여 훨씬 빠르게 연산을 수행하도록 만들 수 있게 됩니다.

djm03178   1년 전

또한 코드 자체에 모듈로 연산이 불필요하게 많습니다. 18번째 줄의 마지막에 있는 %를 제외하고는 모두 지워도 됩니다. 그러면 나누기 연산의 수를 1/6로 줄일 수 있게 됩니다.

swj0324   1년 전

mod를 const로 선언하니까 통과가 안되던게 

600ms 만에 돌아가고

불필요한 모듈로 연산을 줄이니까 

450ms 정도로 실행속도가 단축이 되네요.

이거 때문에 어제부터 많이 답답했는데 감사합니다. 

댓글을 작성하려면 로그인해야 합니다.