BOJ 25958 예쁜수
BOJ 25958 예쁜수
https://www.acmicpc.net/problem/25958
문제
$1$보다 크거나 같은 정수 $N$의 각 자리의 합을 $S$라고 할 때, $S$가 $N$의 약수라면 그 수를 예쁜수라고 하자.
지수는 자연수 $M(M \leq 5,000)$을 예쁜수들의 합으로만 표현하고 싶다.
이때 합이 $M$인 예쁜수들의 구성이 다른 경우에만 다른 방법이다.
예를 들어 $M=4$인 경우, $1+1+2=4$과 $2+1+1=4$는 같은 경우다.
지수를 도와 자연수 $M$을 예쁜수들의 합으로만 표현하는 경우의 수를 구해주자.
경우의 수는 매우 클 수 있으므로 자연수 $M$을 예쁜수들의 합으로 표현하는 경우의 수를 $K(10^6 \leq K \leq 10^7,K$는 소수$)$로 나눈 나머지를 구해주자.
입력
첫 번째 줄에 자연수 $M(1 \leq M \leq 5,000)$과 $K(10^6 \leq K \leq 10^7, K$는 소수$)$가 공백으로 구분되어 주어진다.
출력
$M$을 예쁜수들의 합으로만 표현하는 방법의 수를 $K$로 나눈 나머지를 출력하시오.
예제 입력 1
10 1299721
예제 출력 1
42
예제 입력 2
100 1299721
예제 출력 2
1024698
코드
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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int M = Integer.parseInt(st.nextToken()), K = Integer.parseInt(st.nextToken());
int[] prettyNums = new int[M + 1];
prettyNums[0] = 1;
for (int i = 1; i <= M; i++) {
int calNum = 0;
for (int j = i; j != 0; j /= 10) {
calNum += j % 10;
}
if (i % calNum == 0) {
for (int j = i; j < prettyNums.length; j++) {
prettyNums[j] = (prettyNums[j] + prettyNums[j - i]) % K;
}
}
}
System.out.println(prettyNums[M]);
}
}
This post is licensed under CC BY 4.0 by the author.