이 영역을 누르면 첫 페이지로 이동
Arc 블로그의 첫 페이지로 이동

Arc

페이지 맨 위로 올라가기

Arc

[Baekjoon] 1629: 곱셈

  • 2023.03.21 12:47
  • Algorithm/PS
글 작성자: SeoArc

문제

a^b % c를 구하는 문제이다.

 

풀이

내 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Q1629 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] input = br.readLine().split(" ");
        long a = Long.parseLong(input[0]);
        long b = Long.parseLong(input[1]);
        long c = Long.parseLong(input[2]);

        System.out.println(getMul(a, b, c));
    }

    public static long getMul(long num, long pow, long mod) {
        if (pow == 1) {
            return num % mod;
        }

        long value = getMul(num, pow / 2, mod);
        if (pow % 2 == 0) {
            return (value * value) % mod;
        }
        return (((value * value) % mod) * (num % mod)) % mod;
    }
}

이 문제를 풀이하기 전에 먼저 값의 범위를 보면 2147483647 이하의 자연수임을 확인할 수 있다.

즉 그냥 계속 곱한 후 나머지를 구하면 overflow가 난다는 것은 자명하다.

 

때문에 모듈러 연산을 통해 다음을 구할 수 있다.

(a × b) mod n ≡ ((a mod n) × (b mod n)) mod n

 

하지만 이를 선형 탐색을 통해 해결하면 시간초과가 나게된다.

즉 O(n)으로는 안풀리는 문제인 것이다.

때문에 이를 풀기 위해선, 분할정복을 이용한 거듭제곱을 이용해야한다.

 

그 풀이는 위와 같은데, 지수를 계속 2로 나누면서 들어간 다음 나올때 곱해주는 형식이다.

나왔을 때 지수가 짝수이면 나온 값을 제곱해주고, 홀수이면 제곱한 수에 원래 값을 한 번 더 곱해주면 해결된다.

 

이를 점화식으로 표현하면 다음과 같다.

 

회고

분할정복을 통해 문제를 해결하는 방법이 떠오르지 않아, 위 내용을 공부해서 풀었다.

 

분할정복에 대한 지식과 경험이 부족한 것 같다. 이에 대해 좀 더 공부해봐야겠다.

저작자표시

'Algorithm > PS' 카테고리의 다른 글

[Baekjoon] 1943: 동전 분배  (0) 2023.05.10
[Baekjoon] 11401: 이항 계수 3  (0) 2023.03.30
[Baekjoon] 6064: 카잉 달력  (0) 2023.03.18
[Baekjoon] 17626: Four Squares  (0) 2023.03.17
[Baekjoon] 1654: 랜선 자르기  (0) 2023.03.11

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Baekjoon] 1943: 동전 분배

    [Baekjoon] 1943: 동전 분배

    2023.05.10
  • [Baekjoon] 11401: 이항 계수 3

    [Baekjoon] 11401: 이항 계수 3

    2023.03.30
  • [Baekjoon] 6064: 카잉 달력

    [Baekjoon] 6064: 카잉 달력

    2023.03.18
  • [Baekjoon] 17626: Four Squares

    [Baekjoon] 17626: Four Squares

    2023.03.17
다른 글 더 둘러보기

정보

Arc 블로그의 첫 페이지로 이동

Arc

  • Arc의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (106)
    • Language (28)
      • C++ (0)
      • C# (0)
      • Java (28)
    • Algorithm (47)
      • Algorithm (15)
      • Data Structure (6)
      • PS (26)
    • Computer Science (22)
      • Design Pattern (1)
      • Network (14)
      • OS (7)
    • Game (0)
      • Unity (0)
    • Backend (3)
      • Spring (1)
      • JPA (2)
    • DB (0)
      • SQL (0)
    • DevOps (2)
      • AWS (0)
      • Docker (2)
      • Jenkins (0)
      • Nginx (0)
    • Software Engineering (4)
      • OOP (4)
    • AI (0)
      • Machine Learning (0)
    • Others (0)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • algorithm
  • graph
  • 그래프
  • 네트워크
  • 알고리즘
  • java
  • 자바
  • network

나의 외부 링크

정보

SeoArc의 Arc

Arc

SeoArc

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © SeoArc. Designed by Fraccino.

티스토리툴바