수퍼바이러스

수퍼바이러스

Prob

1 ≤ K ≤ \(10^8\) 인 정수
1 ≤ P ≤ \(10^8\) 인 정수
1 ≤ N ≤ \(10^{16}\) 인 정수
\(KP^{10N}\) 을 1000000007로 나눈 나머지

Solv

Lv.2 바이러스와 마찬가지로 숫자가 커지면 int나 long의 범위를 넘어서므로 P를 곱할 때 마다 나머지 값을 구해서 오버플로 방지
하지만 P를 곱할 때마다 반복문을 사용하면 10N만큼 연산이 필요함
N=\(10^{16}\)인 경우 \(10^{17}\)번 P를 곱하는 연산을 해야하고 복잡도는 \(O(n)\)

P를 일일이 곱하는 대신 이전 P를 다시 곱해서 \(P^2\)로 만들면 \(O(log_2n)\)으로 연산이 단축됨

\(10N\) 에 도달하기 전까지 P를 곱한 값들을 배열에 저장하고 \(10N\) 에서 저장된 값을 빼가면서 해당되는 부분만 곱해주면서 나머지를 구하면 됨

Check

K 1
P 2
N 10

n1234567
i1248163264
ans\(P^1\)\(P^2\)\(P^4\)\(P^8\)\(P^{16}\)\(P^{32}\)\(P^{64}\)
n\(2^{n-1}\)10N
764100
63236
344

Feedback

오버플로와 연산량 모두를 고려해야하는 신박한 문제

Ref


Modified by Sungbin Shim