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 max_c = int(N ** (1 / 2)) + 10 inv = [0] * (max_c + 1) inv[1] = 1 for i in range(2, max_c + 1): inv[i] = M - (M // i) * inv[M % i] % M 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 * inv[old] % M p = p * new % M print(ans)