N = int(input()) M = 998244353 next_u = [1] * 60 next_ui = [1] * 60 for k in range(2, 60): next_ui[k] += 1 next_u[k] = next_ui[k] ** k u_time = [1] u_change = [] v = 1 while v <= N: min_u = next_u[2] min_uk = 2 for k in range(2, 60): if min_u > next_u[k]: min_u = next_u[k] min_uk = k ks = [] for k in range(2, 60): if next_u[k] == min_u: ks.append(k) for k in ks: next_ui[k] += 1 next_u[k] = next_ui[k] ** k if u_time[-1] != min_u: u_time.append(min_u) u_change.append(ks) v = min_u ans = 0 f = False cu = [1] * 60 p = 1 for i in range(len(u_time) - 1): u_i = u_time[i] u_i1 = u_time[i + 1] if u_i1 > N: u_i1 = N + 1 f = True ans = (ans + (p * ((u_i1 - u_i) * (u_i + u_i1 - 1) // 2))) % M if f: break for k in u_change[i]: old = cu[k] cu[k] += 1 new = cu[k] p = p * pow(old, M - 2, M) % M p = p * new % M print(ans)