본문 바로가기

Java/백준

[JAVA] 백준 1629 곱셈

https://www.acmicpc.net/problem/1629

 

1629번: 곱셈

첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.

www.acmicpc.net

 

- 자연수 A를 B번 곱한 수를 알고 싶다. 단 구하려는 수가 매우 커질 수 있으므로 이를 C로 나눈 나머지를 구하는 프로그램

 

 

문제 풀이 

 

분할 정복을 이용한 거듭제곱 

[백준] 1629번 : 곱셈 - JAVA [자바] (tistory.com)

 

 

[백준] 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

분할정복을 이용한 거듭제곱 (tistory.com)

 

 

 

분할정복을 이용한 거듭제곱

어떤 수의 제곱은 해당 수를 두 번을 곱함으로써 구할 수 있다. 이는 제곱식의 지수가 커지더라도 같으며 커지면 지수가 커지면 커질 수록 시간이 오래 걸린다. 예를 들어, 11의 12 제곱은 다음과

isevou.tistory.com

- 임의의 수 C의 n제곱을 구할 때, C를 n번 곱하는 대신 n을 2의 거듭제곱의 합이나 절반으로 나누어 C의 제곱을 반복하여 곱하는 방법 

- 이 방법은 O(n)의 시간 복잡도를 갖는 일반적인 거듭제곱 연산보다 O(logn)의 시간 복잡도로 빠르게 계산이 가능하다.

 

- 지수가 짝수인 경우 n/2로 분할하여 곱으로 계산

ex) 11의 12 제곱은 11의 6제곱과 11의 6제곱의 곱을 통하여 구할 수 있음 

 

- 지수가 홀수인 경우 밑을 한번 더 곱해주면 됨

ex) 11의 13제곱은 13을 반으로 나누고 내림한 수인 6제곱 * 6제곱* 밑 술르 통해서 구할 수 있음

 

 

모듈러 성질 

(a*b)%c = (a%c*b%c)%c

 

정답 

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
	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());
        long A = Long.parseLong(st.nextToken());
        long B = Long.parseLong(st.nextToken());
        C = Long.parseLong(st.nextToken());
        
        bw.write(pow(A,B)%C+"");
        bw.flush();
        bw.close();
        
    }
    
    static long pow(long A, long n)
    {
        if(n==1)
        {
        	return A%C;
        }
        
        long temp = pow(A,n/2);
        
        if(n%2 == 1)
        {
        	return (temp*temp%C)*A%C;
        }
        else
        {
        	return temp*temp%C;
        }
    }
}

 

 

'Java > 백준' 카테고리의 다른 글

[JAVA] 백준 2740 행렬 곱셈  (0) 2024.03.08
[JAVA] 백준 11401 이항 계수 3  (3) 2024.03.08
[JAVA] 백준 1790 종이의 개수  (0) 2024.03.06
[JAVA] 백준 1992 쿼드 트리  (1) 2024.03.06
[JAVA] 백준 2630 색종이 만들기  (0) 2024.03.06