#유형 : 수학, 분할 정복, 재귀
#난이도 : 실버 1
# A,B,C의 값이 2,147,483,647 이하이기 때문에, 단순하게 for문을 돌리면 시간복잡도가 너무 답이 없다.
여기서 분할 정복의 바탕인 재귀를 사용한다면 어떻게 될까?
2^31이 약 2,147,483,647 이기 때문에, 2,147,483,647 번 돌리는 반복문 댓긴 재귀 방식을 활용하면 31번의 연산으로 퉁칠수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
package bj;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class p1629 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
long A,B,C;
StringTokenizer st = new StringTokenizer(br.readLine());
A = Long.parseLong(st.nextToken());
B = Long.parseLong(st.nextToken());
C = Long.parseLong(st.nextToken());
System.out.println(solve(A%C, B, C));
}
public static long solve(long a, long b, long c) {
if(b == 1)
return a;
else {
long next = solve(a, b/2, c);
if(b%2 == 1) {
return ((next * next) % c * a) % c;
}else
return (next*next)%c;
}
}
}
|
cs |
'백준' 카테고리의 다른 글
#백준_9012 괄호 - Java 자바 (0) | 2020.07.06 |
---|---|
#백준_10828 스택 - Java 자바 (0) | 2020.07.06 |
#백준_2096 내려가기 - Java 자바 (0) | 2020.06.27 |
#백준_2473 세 용액 - Java 자바 (0) | 2020.05.11 |
#백준_1149 RGB거리 - Java 자바 (0) | 2020.05.06 |