🐣 알고리즘 삐약/💻 백준 삐약
90 삐약 : 백준 1629| 곱셈 [바킹독| 재귀 |JAVA]
우주수첩
2024. 9. 10. 14:22
728x90
https://www.acmicpc.net/problem/1629
package BKD_0x0B_Recursion;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ_1629 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
long a = Integer.parseInt( st.nextToken());
long b = Integer.parseInt( st.nextToken());
long c = Integer.parseInt( st.nextToken());
System.out.println(pow(a,b,c));
}
public static long pow(long a, long b, long c){
if(b==1) return a%c; // Base Condition
long val = pow(a, b/2, c);
val = val*val % c;
if(b%2 ==0) return val; // b가 짝수일 경우
return val*a%c; //b 가 홀수일 경우
}
}
❗️시간 복잡도 : O(logb)
풀이
❗️b가 최대 21억 가까이 될 수 있기 때문에 시간 초과가 발생할 가능성이 다분하다.
1승을 계산할 수 있다.
k승을 계산했으면 2k승과 2k+1승 또한 O(1)에 계산할 수 있다.
=> a의 임의의 지수승을 귀납적으로 계산 가능하다.
long val = func(a,b/2,c) * func(a,b/2,c);
위와 같이 코드를 구현했을 경우 시간복잡도가 O(b)가 되어 시간 초과가 발생할 수 있다.
728x90