본문 바로가기
ps

[백준] 16400 - 소수 화폐

by kariskan 2023. 2. 14.

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

 

16400번: 소수 화폐

구매하려고하는 물건의 값 N(2 ≤ N ≤ 40,000, N은 정수)이 주어진다.

www.acmicpc.net

 

에라토스 테네스의 체 + dp 문제였다.

먼저 화폐의 종류를 구하기 위해 에라토스 테네스의 체로 N 이하의 소수를 걸러내자.

인접 리스트를 활용해 N 이하의 모든 소수를 담고, 해당 소수들로 지불할 수 있는 방법의 수를 dp로 구하면 된다.

 

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;

int a[40001], dp[40001];
vector<int> prime;

int main()
{
	int n;
	cin >> n;
	for (int i = 2; i * i <= 40000; i++)
	{
		if (!a[i])
		{
			for (int j = i * i; j <= 40000; j += i)
			{
				a[j] = 1;
			}
		}
	}
	for (int i = 2; i <= 40000; i++)
	{
		if (!a[i])
		{
			prime.push_back(i);
		}
	}
	int mod = 123456789;
	dp[0] = 1;
	for (int i = 0; i < prime.size(); i++)
	{
		for (int j = prime[i]; j <= n; j++)
		{
			dp[j] = (dp[j] % mod + dp[j - prime[i]] % mod) % mod;
		}
	}

	cout << dp[n];
}

'ps' 카테고리의 다른 글

[백준] 16500 - 문자열 판별  (0) 2023.06.20
[백준] 1765 - 닭싸움 팀 정하기  (0) 2023.06.20
[백준] 2022 - 사다리  (0) 2023.02.14
[백준] 2982 - 국왕의 방문  (0) 2023.01.22
[백준] 2307 - 도로검문  (0) 2023.01.21

댓글