본문 바로가기

알고리즘/분류

분할-정복 알고리즘(Divide-Conquer)

[개념]

data-make.tistory.com/232

 

[Algorithm] 분할 정복(Divide & Conquer)

# Divide & Conquer ## about - 가장 유명한 알고리즘 디자인 패러다임 - 분할 정복 패러다임을 차용한 알고리즘들은 주어진 문제를 둘 이상의 부분 문제로 나눈 뒤 각 문제에 대한 답을 재귀 호출을 이��

data-make.tistory.com

 

 

 

 

 

[관련 문제 - 1]

www.acmicpc.net/problem/16943

 

16943번: 숫자 재배치

두 정수 A와 B가 있을 때, A에 포함된 숫자의 순서를 섞어서 새로운 수 C를 만들려고 한다. 즉, C는 A의 순열 중 하나가 되어야 한다.  가능한 C 중에서 B보다 작거나 같으면서, 가장 큰 값을 구해보�

www.acmicpc.net

#include <iostream>
using namespace std;

int a, b, c;

//a^7 = (a^3)^2 * a
int pow(int n, int k) {
	if (k == 0) return 1;
	if (k == 1) return n;

	long long tmp = pow(n, k / 2);

	if (k % 2) {
		return (((tmp * tmp) % c) * a) % c;
	}
	else {
		return (tmp * tmp) % c;
	}
}

int main() {
	cin >> a >> b >> c;

	cout << pow(a % c, b) << endl;
}

 

 

 

 

 

[관련 문제 - 2]

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

 

18291번: 비요뜨의 징검다리 건너기

강을 건너는 방법은, (1 → 4), (1 → 2 → 4), (1 → 3 → 4), (1 → 2 → 3 → 4)의 4가지이다.

www.acmicpc.net

#include <iostream>
//#include <cmath>
using namespace std;
typedef long long ll;
const ll M = 1e9 + 7;

//n의 범위가 10억이 넘기 때문에 분할 정복 사용 
int pow(int a, int b) {
	if (b == 0) return 1; //중요!

	ll mul = pow(2, b / 2);

	//짝수면
	if (b % 2 == 0) {
		return (mul * mul) % M;
	}
	//홀수면
	else {
		return (a * (mul * mul % M)) % M;
	}
}

int main() {
	int tc;
	cin >> tc;

	while (tc--) {
		int n;
		cin >> n;

		long long ans = 0;
		if (n == 1) {
			cout << 1 << endl;
			continue;
		}
		else {
			cout << pow(2, n - 2) << endl;
		}
	}
}

'알고리즘 > 분류' 카테고리의 다른 글

유니온 - 파인드(Disjoint Set) 핵심코드  (0) 2020.05.28
KMP  (0) 2020.05.13
구간 합(prefix sum) (feat. 2차원 배열)  (0) 2020.04.24
DFS와 BFS 차이 한눈에 비교  (0) 2020.04.22
그리디  (0) 2020.02.28