Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- Spring Data JPA
- 카프카
- aws
- 클라우드 컴퓨팅
- gcp
- 월미도
- Spring Boot
- 스프링
- JPA
- Kafka
- 오일러프로젝트
- VPC
- 프로그래밍문제
- 스프링부트
- 인천여행
- 로드밸런서
- Spring
- DFS
- 백트래킹
- Apache Kafka
- 코드업
- 클라우드
- 백준
- 스프링 부트
- 쿠버네티스
- springboot
- 자료구조
- Elasticsearch
- Docker
- 알고리즘
Archives
- Today
- Total
GW LABS
[코드업 2640] n의 k승 구하기 2 본문
해당 문제는 단순히 동적계획법 패턴만으로는 메모리 초과가 발생하기 때문에 다른 방법을 사용했다. 분할과 정복 알고리즘을 사용하면 비교적 쉽게 풀 수 있다. 여기에 동적계획법을 적용하면 만족할 만한 실행속도도 확보할 수 있다.
#include <iostream>
using namespace std;
unsigned int cache[50000];
unsigned int mul(unsigned int n, unsigned int k) {
if (k == 0) {
return 1;
}
else if (k == 1) {
return n;
}
else {
unsigned int oddTrigger = 0;
if (k % 2 == 1) oddTrigger = 1;
unsigned long long left, right;
if ((k / 2) + oddTrigger < 50000) {
if (cache[(k / 2) + oddTrigger]) {
left = cache[(k / 2) + oddTrigger];
}
else {
cache[(k / 2) + oddTrigger] = left = mul(n, (k / 2) + oddTrigger);
}
}
else {
left = mul(n, (k / 2) + oddTrigger);
}
if ((k / 2) < 50000) {
if (cache[(k / 2)]) {
right = cache[(k / 2)];
}
else {
cache[(k / 2)] = right = mul(n, (k / 2));
}
}
else {
right = mul(n, (k / 2));
}
return (left * right) % 1000000007;
}
}
int main() {
unsigned int n, k;
cin >> n >> k;
cout << mul(n, k) << endl;
return 0;
}
// 100000 100000000
사실 위의 코드도 최적화할 수 있는 방법이 많지만 우선 통과한 코드를 포스팅해본다. 독자 여러분들은 이미 최적화할 수 있는 방법을 찾았다고 생각한다!
'Algorithm & DataStructure' 카테고리의 다른 글
[오일러 프로젝트 25] 피보나치 수열에서 처음으로 1000자리가 되는 항은 몇 번째? (0) | 2020.06.18 |
---|---|
[오일러 프로젝트 23] 두 초과수의 합으로 나타낼 수 없는 모든 양의 정수의 합은? (0) | 2020.06.17 |
[오일러 프로젝트 21] 10000 이하 모든 친화수(우애수)의 합은? (0) | 2020.06.16 |
[오일러 프로젝트 17] 1부터 1000까지 영어로 썼을 때 사용된 글자의 개수는? (0) | 2020.06.09 |
[오일러 프로젝트 16] 2^1000의 자리수 구하기 (0) | 2020.06.05 |
Comments