Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 동적계획법과최단거리역추적
- Flutter
- 분할정복
- C++
- AndroidStudio
- DFS와BFS
- 파이썬
- issue
- 알고리즘
- 코테
- codingtest
- 안드로이드스튜디오
- Python
- android
- 코드품앗이
- DART
- 백준
- 동적계획법
- cos pro
- Vue
- vuejs
- 코딩테스트
- Algorithm
- BAEKJOON
- cos pro 1급
- 안드로이드
- DFS
- cos
- 개발
- django
Archives
- Today
- Total
Development Artist
[Baekjoon, C++] 1629번 : 곱셈 본문
728x90
반응형
백준 단계별 풀기에서 분할정복 네 번째 문제이다.
링크는 아래와 같다.
1. 시간복잡도를 생각해 보아야 하는 문제이다. 단순히 a^n 하면 시간 복잡도는 얼마인가? O(n)이다. 시간 복잡도가 무엇인가? 어떤 프로그램 또는 알고리즘이 수행하는데 소요되는 시간을 보여주는 것이라고 볼 수 있다. $$2^n > n^3 > n^2 > n*logn > n > logn > 1$$ 순이다.
여기서 분할정복 메커니즘을 활용한 알고리즘을 사용하면 O(log n)의 복잡도의 알고리즘으로 문제를 해결할 수 있다. 알고리즘 출처는 아래와 같다.
en.wikipedia.org/wiki/Exponentiation_by_squaring
이곳에서 설명하는 이진 지수 거듭 제곱은 예를 들어 $$ x^9 $$이 있다면, 9은 이진법으로 $$1001_2$$이고, $$x^8*x^1$$로 표현할 수 있다. x의 거듭제곱을 다음과 같이 2로 쪼개서(재귀) 해당 하는 숫자들만을 계산하는 방식을 2의 Exponentiation by squaring 방식이라고 한다.
2. 데이터 타입을 어떻게 할 것인가, 지수계산을 처리하는데 있어서 도중에 데이터 타입이 수용할 수 있는 크기보다 넘어설 수 있다. 그래서 long long 타입을 써서, 범위를 수용할 수 있게끔 합니다.
#include<iostream>
using namespace std;
long long int a;
long long int b;
int c;
long long int APowerB(long long int a, long long int b) {
if (b == 0) // 거듭제곱이 0일때는 무조건 1
return 1;
else if (b == 1) // 거듭제곱이 1일때는 계속해서 a 반환
return a;
if (b % 2 > 0) // 거듭제곱을 2로 나눈 나머지.
return APowerB(a, b - 1) * a;
long long int binarySquaring = APowerB(a, b / 2);
binarySquaring %= c;
return (binarySquaring * binarySquaring) % c;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> a >> b >> c;
cout << APowerB(a, b) % c;
return 0;
}
이상으로 1629번 문제를 마치겠다.
728x90
반응형
'Algorithm > Baekjoon' 카테고리의 다른 글
[Baekjoon, C++] 2740번: 행렬 곱셈 (0) | 2021.01.27 |
---|---|
[Baekjoon, C++] 11401번 : 이항 계수 3 (0) | 2021.01.26 |
[Baekjoon, C++] 1780번 : 종이의 개수 (0) | 2021.01.23 |
[Baekjoon, C++] 1992번 : 쿼드트리 (0) | 2021.01.22 |
[Beakjoon, C++] 2630번 : 색종이 만들기 (0) | 2021.01.21 |
Comments