from bisect import bisect_left,bisect_right MOD = 998244353 N,M,K = map(int,input().split()) A = set() C = {} for i in range(1,M+1): A.add(M//i) C[M//i] = C.get(M//i,0)+1 A = sorted(list(A)) C = sorted(list(C.items()),key=lambda x:x[0]) C = [C[i][1] for i in range(len(C))] W = len(A) T = [[0 for _ in range(W)] for _ in range(W)] for j in range(W): indl = bisect_left(A,A[j]-K) indr = bisect_right(A,A[j]+K) for i in range(indl,indr): T[i][j] = C[j] def matmul(A,B): C = [[0 for _ in range(W)] for _ in range(W)] for i in range(W): for j in range(W): for k in range(W): C[i][j] = (C[i][j]+A[i][k]*B[k][j])%MOD return C I = [[0 for _ in range(W)] for _ in range(W)] for i in range(W): I[i][i] = 1 def matpow(A,n): if n==0: return I if n==1: return A B = matpow(A,n//2) if n%2==0: return matmul(B,B) return matmul(A,matmul(B,B)) P1 = [C[i] for i in range(W)] TN = matpow(T,N-1) PN = [0 for _ in range(W)] for j in range(W): for k in range(W): PN[j] = (PN[j]+P1[k]*TN[k][j])%MOD ans = 0 for i in range(W): ans = (ans+PN[i])%MOD print(ans)