백준|1629번|곱셈

JSK·2022년 7월 31일
0

자바 PS풀이

목록 보기
35/51

문제설명
자연수 A, B, C를 입력받고 A의 B 제곱을 C로 나눈 나머지를 구하는 문제입니다.

작동 순서
1. 자연수 A, B, C를 입력받습니다.
2. B가 2의 배수일 경우 ((A(B/2)%C)*(A(B/2)%C))(분할정복)를 반환합니다.
3. B가 2의 배수가 아닌 경우 ((A(B/2)%C)*(A(B/2)%C)*A%C)를 반환합니다.
4. 연산결과를 memo에 저장을 하고 같은 값을 다시 불러와야할 경우 똑같은 계산을 다시 수행하지않고 memo에 저장되어 있는 값을 가져옵니다.
5. 연산을 한 뒤 연산 결과를 출력합니다.

소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public class 백준_1629번_곱셈 {
    static Map<Long, Long> memo = new HashMap<>();
    static long power(long A, long B, long C){
        if(B==1) return A%C;
        else if(B>=2){
            if (B%2 == 0) {
                if (!memo.containsKey(B/2)){
                    memo.put(B/2, power(A%C, B/2, C)%C);
                }
                return (memo.get(B/2) * memo.get(B/2))%C;
            }
            else {
                if (!memo.containsKey(B/2)){
                    memo.put(B/2, power(A%C, B/2, C)%C);
                }
                return ((memo.get(B/2) * memo.get(B/2) % C) * A%C)%C;
            }
        }
        else return 1;
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        int A = Integer.parseInt(input[0]), B = Integer.parseInt(input[1]), C = Integer.parseInt(input[2]);
        System.out.print(power(A,B,C));
    }
}
profile
학사지만 AI하고 싶어요...

0개의 댓글