Udało mi się to rozwiązać wystarczyło trochę pozamieniać twoje rozwiązanie, usunąłem stan z pierwszą cyfrą (bo nie wchodziło czasowo) i dodałem stan z modulo. Kod jest dosyć prosty i krótki, dlatego uważam, że idzie zrozumieć bez tłumaczenia, chętnie odpowiem na ewentualne pytania.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 201;
const long long inf = 1e18 + 1;
int s, m, q;
ll pot[N]; //10^n % m
ll dp[N][N][N];
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> s >> m >> q;
dp[0][0][0] = 1;
pot[0] = 1;
for (int i = 1; i < N; i++) {
pot[i] = pot[i - 1] * 10 % m;
for (int j = 0; j <= s; j++) {
for (int k = 0; k < m; k++) {
for (int l = 0; l <= min(9, j); l++) {
dp[i][j][k] += dp[i - 1][j - l][(k + 10*m - l*pot[i-1]) % m];
dp[i][j][k] = min(dp[i][j][k], inf);
}
}
}
}
while (q--) {
ll k;
cin >> k;
if (dp[N-1][s][0] < k) {
cout << "NIE\n";
continue;
}
string res = "";
bool zeros = true; //czy (jeszcze) stawiam zera na poczatku liczby
int cs = s; //aktualna suma
int cm = 0; //aktualne modulo
for (int i = N-1; i > 0; i--) {
for (int l = 0; l <= min(9, cs); l++) {
ll val = dp[i - 1][cs - l][(10*m + cm - l*pot[i-1]) % m];
if (k <= val) {
if (!zeros || l > 0 || i == 1) {
res += (char) (l + '0');
zeros = false;
}
cs -= l;
cm = (10*m + cm - l*pot[i-1]) % m;
break;
}
k -= val;
}
}
cout << res << "\n";
}
}