[BOJ / C++] 곱셈 (재귀)

2025. 7. 9. 22:24·코딩테스트/BOJ

문제링크: https://www.acmicpc.net/problem/1629

 

1. 코드

#include <bits/stdc++.h>
using namespace std;

using ll = long long;

ll POW(ll a, ll b, ll m) {
	if (b == 0) return 1 % m;
	if (b == 1) return a % m;

	ll val = POW(a, b/2, m);
	val = val * val % m;
	if (b % 2 == 0) return val;
	return val * a % m;
}

int main() {
	ios::sync_with_stdio(0); cin.tie(0);

	ll a, b, c;
	cin >> a >> b >> c;
	cout << POW(a, b, c);
}

 

 

2. 분석

1. Base Condition

if (b == 0) return 1 % m;
if (b == 1) return a % m;

지수(b)가 0이면 a^0 = 1이므로 1%m을 리턴해줘야한다. 지수(b)가 1이면 a^1 = a이므로 a mod m을 리턴한다.

 

2. 재귀호출 (반으로 나누기)

ll val = POW(a, b/2, m);

지수를 절반 (b/2)으로 줄여서 먼저 계산한다. 즉, a^(b/2) mod m을 계산한다.

 

3. 제곱 and modulo

val = val * val % m;

그 값을 제곱한 뒤 다시 m으로 나눈다.

 

4. 홀짝 보정

if (b % 2 == 0) return val;
return val * a % m;

b가 짝수면 끝, 홀수면 위 val에 a를 한번 더 곱해서 a^2(b/2)+1 = a^b를 완성해 다시 m으로 나눈다.

 

3. 시간복잡도

재귀 깊이가 절반씩 줄어들어 log b이므로 시간복잡도는 O(log b)이다.

 

 

 

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ / C++] Z (재귀)  (1) 2025.07.11
[BOJ / C++] 하노이 탑 이동 순서 (재귀)  (0) 2025.07.10
[BOJ / C++] 안전 영역 (BFS)  (0) 2025.07.08
[BOJ / C++] 스타트링크 (BFS)  (0) 2025.07.08
[BOJ / C++] 단지번호붙이기 (BFS)  (0) 2025.07.07
'코딩테스트/BOJ' 카테고리의 다른 글
  • [BOJ / C++] Z (재귀)
  • [BOJ / C++] 하노이 탑 이동 순서 (재귀)
  • [BOJ / C++] 안전 영역 (BFS)
  • [BOJ / C++] 스타트링크 (BFS)
sophon
sophon
sophon 님의 블로그 입니다.
  • sophon
    sophon 님의 블로그
    sophon
    • 카테고리 (172) N
      • 컴퓨터공학 (36)
        • 데이터베이스 (19)
        • 네트워크 (15)
        • 기타 이슈 (2)
      • 프로젝트 (16) N
        • Java (8)
        • Spring (4) N
        • Docker (4)
      • 코딩테스트 (95) N
        • BOJ (74)
        • 프로그래머스 (7)
        • 프로그래머스 SQL (12) N
        • PS Snippets (2)
      • 🌱 잡담 (22)
        • 자격증 (7)
        • 좋은 시 모음 (12)
        • 책과 영화 (3)
        • 기록 (0)
  • 전체
    오늘
    어제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
sophon
[BOJ / C++] 곱셈 (재귀)
상단으로

티스토리툴바