Skip to content

Commit 4ccfea3

Browse files
authored
Merge pull request #1727 from AlgorithmWithGod/khj20006
[20251222] BOJ / P3 / 수열의 개수 NKD / 권혁준
2 parents 1bbdda6 + f304f16 commit 4ccfea3

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
```java
2+
import java.util.*;
3+
import java.io.*;
4+
5+
public class Main {
6+
7+
static BufferedReader br;
8+
static BufferedWriter bw;
9+
static StringTokenizer st;
10+
11+
static final long MOD = (long)1e9 + 7;
12+
static int N, K, D;
13+
static long[] dp;
14+
15+
public static void main(String[] args) throws Exception {
16+
bw = new BufferedWriter(new OutputStreamWriter(System.out));
17+
18+
input();
19+
solve();
20+
21+
bw.close();
22+
}
23+
24+
public static void input() throws Exception {
25+
br = new BufferedReader(new InputStreamReader(System.in));
26+
27+
st = new StringTokenizer(br.readLine());
28+
N = Integer.parseInt(st.nextToken());
29+
K = Integer.parseInt(st.nextToken());
30+
D = Integer.parseInt(st.nextToken());
31+
32+
br.close();
33+
}
34+
35+
public static void solve() throws Exception {
36+
bw = new BufferedWriter(new OutputStreamWriter(System.out));
37+
38+
if(K > 446) {
39+
bw.write("0");
40+
return;
41+
}
42+
if(K == 1) {
43+
bw.write(N <= D ? "1" : "0");
44+
return;
45+
}
46+
47+
dp = new long[N+2];
48+
for(int k=1;k<=K;k++) {
49+
long[] pre = new long[N+2];
50+
if(k == 1) {
51+
for(int i=1;i<=D;i++) {
52+
if(2*i+1 <= N) pre[2*i+1] = (pre[2*i+1] + 1) % MOD;
53+
if(2*i+D+1 <= N) pre[2*i+D+1] = (pre[2*i+D+1] + MOD - 1) % MOD;
54+
}
55+
}
56+
else {
57+
int limit = (long)k * D >= (long)N ? N : k * D;
58+
for(int i=1;i<=limit;i++) {
59+
if(2*limit+1 <= N) pre[2*limit+1] = (pre[2*limit+1] + dp[i]) % MOD;
60+
if(2*limit+D+1 <= N) pre[2*limit+D+1] = (pre[2*limit+D+1] + MOD - dp[i]) % MOD;
61+
}
62+
}
63+
64+
long s = 0;
65+
for(int i=1;i<=N;i++) {
66+
s = (s + pre[i]) % MOD;
67+
pre[i] = s;
68+
}
69+
for(int i=1;i<=N;i++) dp[i] = pre[i];
70+
}
71+
bw.write(dp[N] + "\n");
72+
73+
bw.close();
74+
}
75+
76+
}
77+
```

0 commit comments

Comments
 (0)