#include<cstdio> #include<algorithm> constint MAXP = 50; constint MAXM = 1000; constint MAXM_EXTEND = 2048; constint MOD = 998244353; constint G = 3; voidexgcd(longlong a, longlong b, longlong &x, longlong &y){ if (!b) x = 1, y = 0; else exgcd(b, a % b, y, x), y -= x * (a / b); } longlonginv(longlong x){ longlong res, temp; exgcd(x, MOD, res, temp); return (res + MOD) % MOD; } longlongpow(longlong a, longlong n){ longlong res = 1; for (; n; n >>= 1, a = a * a % MOD) if (n & 1) res = res * a % MOD; return res; } namespace NumberTheoreticTransform { staticconstint N = 2048; longlong omega[N], omegaInv[N]; voidinit(){ longlong g = pow(G, (MOD - 1) / N), ig = inv(g); omega[0] = omegaInv[0] = 1; for (int i = 1; i < N; i++) { omega[i] = omega[i - 1] * g % MOD; omegaInv[i] = omegaInv[i - 1] * ig % MOD; } } intextend(int n){ int res = 1; while (res < n) res <<= 1; return res; } voidreverse(longlong *a, int n){ int k = 0; while ((1 << k) < n) k++; for (int i = 0, j = 0; i < n; i++) { if (i < j) std::swap(a[i], a[j]); for (int l = n >> 1; (j ^= l) < l; l >>= 1); } } voidtransform(longlong *a, int n, longlong *omega){ reverse(a, n); for (int l = 2; l <= n; l <<= 1) { int hl = l >> 1; for (longlong *x = a; x != a + n; x += l) { for (int i = 0; i < hl; i++) { longlong t = omega[N / l * i] * x[i + hl] % MOD; x[hl + i] = (x[i] - t + MOD) % MOD; (x[i] += t) %= MOD; } } } } voiddft(longlong *a, int n){ transform(a, n, omega); } voididft(longlong *a, int n){ transform(a, n, omegaInv); longlong t = inv(n); for (int i = 0; i < n; i++) (a[i] *= t) %= MOD; } } int p, m; structData { longlongpow, a[MAXP][MAXM_EXTEND]; Data() : pow(1), a() {} }; Data operator*(Data &a, Data &b) { Data res; res.pow = a.pow * b.pow % p; int s = NumberTheoreticTransform::extend(m + 1) * 2; for (int i = 0; i < p; i++) { NumberTheoreticTransform::dft(a.a[i], s); if (&a != &b) NumberTheoreticTransform::dft(b.a[i], s); } for (int i1 = 0; i1 < p; i1++) for (int i2 = 0; i2 < p; i2++) { staticlonglong temp[MAXM_EXTEND]; for (int i = 0; i < s; i++) temp[i] = a.a[i1][i] * b.a[i2][i]; NumberTheoreticTransform::idft(temp, s); for (int i = 0; i <= m; i++) (res.a[(i1 * b.pow + i2) % p][i] += temp[i]) %= MOD; } for (int i = 0; i < p; i++) { NumberTheoreticTransform::idft(a.a[i], s); if (&a != &b) NumberTheoreticTransform::idft(b.a[i], s); } return res; } Data pow(Data a, int n){ Data res; res.a[0][0] = 1; for (; n; n >>= 1, a = a * a) if (n & 1) res = res * a; return res; } intmain(){ NumberTheoreticTransform::init(); int n; scanf("%d %d %d", &n, &p, &m); Data init; init.pow = 10; for (int i = 0; i <= std::min(9, m); i++) init.a[i % p][i]++; Data res = pow(init, n); longlong ans = 0; for (int i = 0; i <= m; i++) { (ans += res.a[0][i]) %= MOD; printf("%lld%c", ans, " \n"[i == m]); } return0; }