PS/Problems
[Java] 백준 1629번 곱셈 - 분할정복법
CalicoCat22
2022. 1. 1. 04:18
분할정복법
신기하다.
Integer의 max value로 세번만 곱해져도 long범위 넘어갈수도 있으니
long의 범위를 넘기지 않기 위해 수시로 모듈러연산을 해주어야한다!
https://st-lab.tistory.com/237
좋은 설명 감사합니다
[백준] 1629번 : 곱셈 - JAVA [자바]
www.acmicpc.net/problem/1629 1629번: 곱셈 첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다. www.acmicpc.net 문제 알고리즘 [접근 방법] 이 문..
st-lab.tistory.com
import java.util.*;
import java.io.*;
public class s1_1629 {
static long a;
static long c;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
a = Integer.parseInt(st.nextToken());
long b = Integer.parseInt((st.nextToken()));
c = Integer.parseInt(st.nextToken());
long ans = daq(b);
bw.write(String.valueOf(ans));
bw.flush();
bw.close();
}
//daq(k) = Math.pow(a, k) mod c 를 분할정복하는 코드
public static long daq(long k){
if (k == 1){
return (a % c);
}
else{
long temp = daq(k / 2);
if ((k & 1) == 0){
return temp * temp % c;
}
else{
return ((temp * temp % c) * (a % c)) % c;
}
}
}
}