# 法 (mod) big2 = 998244353 def nosimple(n): """ O(sqrt(N) * logN) で sum_{i=1}^{n} (floor(n/i))^i mod big2 を計算する """ ans = 0 temp = n # 第2ループの上限を保持する # --- 第1ループ (i*i <= n の範囲) --- # floor(n/i) の値が k (k <= sqrt(N)) となる i の区間についてまとめて計算 i = 1 while i * i <= n: k = i # C++コードのループ変数 i を k と読み替える up = n // k down = n // (k + 1) # floor(n/i) = k となる i の区間は [down + 1, up] # 等比数列の和: sum_{j=down+1}^{up} k^j を計算する # 初項 a = k^(down+1) # 公比 r = k # 項数 num = up - down a = pow(k, down + 1, big2) b = pow(k, up - down, big2) # k^num if k == 1: # k=1 の場合 (公比が1) # 1 を (up - down) 回足す ans += (up - down) else: # k > 1 の場合 (等比数列の和の公式) # a * (b - 1) / (k - 1) # (k-1) の逆元を求める (フェルマーの小定理) inv_k_minus_1 = pow(k - 1, big2 - 2, big2) # (b - 1) term = (b - 1 + big2) % big2 # * (k - 1)^-1 term = (term * inv_k_minus_1) % big2 # * a term = (a * term) % big2 ans += term ans %= big2 temp = down # C++コードの temp = n/(i+1) と同じ i += 1 # --- 第2ループ (i が 1 から temp (約sqrt(N)) まで) --- # floor(n/i) の値が sqrt(N) より大きい i について計算 for i in range(1, temp + 1): k = n // i if k == 0: # n/i < 1 の場合は 0^i なので 0 (i >= 1) continue ans += pow(k, i, big2) ans %= big2 return ans # --- メイン処理 --- if __name__ == "__main__": N = int(input()) print(nosimple(N))