# <a href="https://codeforces.com/problemset/problem/543/A">Contest #2 - C. Writing Code</a> - Intinya soal ini, kita disuruh mencari banyaknya cara berbeda untuk menulis $m$ baris kode dengan syarat banyaknya bugs $\le b$. - Sangat jelas bahwa soal ini dapat diselesaikan menggunakan DP. - Terdapat 2 states dalam DP ini: <br> 1. Banyak baris kode <br> 2. Banyak bugs - $dp[i][j]$ didefinisikan sebagai banyaknya cara berbeda untuk menulis $i$ baris kode dengan terdapat $j$ bugs di dalamnya. - Base case: $dp[0][0] = 1$ - Alasan didapatkannya base case tersebut karena satu-satunya kemungkinan banyak bugs dalam $0$ baris kode adalah $0$. - Perlu diperhatikan bahwa perbedaan urutan programmers tidak mempengaruhi konfigurasi, contoh: $\{a[1], a[2]\} = \{a[2], a[1]\}$, sehingga outer loop-nya adalah iterasi programmer agar menghindari perbedaan dalam konteks permutasi. - Urutan hierarki nested loop: <br> 1. Programmer $\{i |1 \le i \le n\}$ <br> 2. Banyak baris kode $\{j | 1 \le j \le m\}$ <br> 3. Banyak bugs $\{k|0 \le k \le b\}$ - Kompleksitas waktu: $O(n \cdot m \cdot (b + 1))$ :::spoiler Solusi ```cpp #include <bits/stdc++.h> #define int long long using namespace std; int n, m, b, mod, a[505], dp[505][505]; // dp[i][j] = banyaknya cara agar di dalam i lines, terdapat j bugs signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m >> b >> mod; for (int i = 1; i <= n; ++i) { cin >> a[i]; } dp[0][0] = 1; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { for (int k = 0; k <= b; ++k) { if (a[i] <= k) { dp[j][k] += dp[j - 1][k - a[i]]; dp[j][k] %= mod; } } } } int ans = 0; for (int j = 0; j <= b; ++j) { ans += dp[m][j]; ans %= mod; } cout << ans << '\n'; } ``` :::