문제 링크입니다: https://www.acmicpc.net/problem/16400
에라토스테네스의 체를 이용하여 소수만 저장한 벡터를 구하고 해당 벡터를 이용하여 동전 DP를 적용하면 되는 문제였습니다.
동전 DP가 익숙하지 않으신 분들은 백준 2293번 동전 1(https://www.acmicpc.net/problem/2293) 문제를 먼저 풀어보시는 것을 추천드립니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAX = 40000 + 1;
const int MOD = 123456789;
int N;
int cache[MAX];
int minFactor[MAX];
vector<int> prime;
void eratosthenes(void)
{
minFactor[0] = minFactor[1] = -1;
for (int i = 2; i < MAX; i++)
minFactor[i] = i;
for(int i=2; i<MAX; i++)
if (minFactor[i] == i)
{
for (int j = i * i; j < MAX; j += i)
if (minFactor[j] == j)
minFactor[j] = i;
}
//소수만 저장
for (int i = 2; i < MAX; i++)
if (minFactor[i] == i)
prime.push_back(i);
}
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N;
eratosthenes();
//전형적인 동전 DP
cache[0] = 1;
for (int i = 0; i < prime.size(); i++)
for (int j = prime[i]; j <= N; j++)
{
cache[j] = (cache[j] + cache[j - prime[i]]) % MOD;
cache[j] %= MOD;
}
cout << cache[N] << "\n";
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > BOJ' 카테고리의 다른 글
백준 16402번 제국 (0) | 2018.11.10 |
---|---|
백준 16401번 과자 나눠주기 (0) | 2018.11.10 |
백준 16398번 행성 연결 (0) | 2018.11.10 |
백준 16397번 탈출 (0) | 2018.11.10 |
백준 16396번 선 그리기 (0) | 2018.11.10 |