#include #include #include using namespace std; vector> mul(vector> &a, vector> &b, long long m) { int siz = a.size(); vector> ret(siz, vector (siz)); for (int i = 0; i < siz; ++i) for (int j = 0; j < siz; ++j) for (int k = 0; k < siz; ++k) ret[i][j] = (ret[i][j] + a[i][k] * b[k][j]) % m; return ret; } vector> pow(vector> a, long long k, long long m) { int siz = a.size(); vector> ret(siz, vector (siz)); for (int i = 0; i < siz; ++i) ret[i][i] = 1; for (; k > 0; k >>= 1, a = mul(a, a, m)) if (k & 1) ret = mul(ret, a, m); return ret; } int main() { const int mod = 998244353; int n, m, k; cin >> n >> m >> k; vector all; for (int i = 1; i <= m; ++i) all.push_back(m / i); sort(all.begin(), all.end()); all.erase(unique(all.begin(), all.end()), all.end()); int siz = all.size(); vector cnt(siz); for (int i = 1; i <= m; ++i) { int id = lower_bound(all.begin(), all.end(), m / i) - all.begin(); ++cnt[id]; } vector> mat(siz, vector (siz)); for (int i = 0; i < siz; ++i) for (int j = 0; j < siz; ++j) if (abs(all[i] - all[j]) <= k) mat[i][j] = cnt[j]; auto res = pow(mat, n - 1, mod); long long ans = 0; for (int i = 0; i < siz; ++i) for (int j = 0; j < siz; ++j) ans = (ans + (long long)cnt[i] * res[i][j]) % mod; cout << ans << endl; }