#include <bits/stdc++.h>
#define F first
#define S second
#define pb push_back
#define mp make_pair
#define all(x) x.begin(),x.end()
#define nl '\n'
#define print(vec,l,r) {for(int _i_ = (l); _i_ < (r); _i_++) cout << (vec)[_i_] <<" "; cout << endl;}
#define forf(i,a,b) for(int i = (a); i < (b); i++)
#define forb(i,a,b) for(int i = (b)-1; i >= (a); i--)
#define input(vec,N) for(int _i_ = 0; _i_ < (N); _i_++) cin >> (vec)[_i_];
#define debug(x) cerr << #x << " = " << (x) << endl;
#define si(x) int(x.size())

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef pair<int , int> pi;

const ll M = 998244353;
vi primes;

ll nof(int i)
{
	ll answer = 1;
	int cur = 0;
	while(primes[cur]*primes[cur] <= i)
	{
		int count = 1;
		while(i % primes[cur] == 0) 
		{
			count++;
			i /= primes[cur];
		}
		answer *= count;
		cur++;
	}
	if(i != 1) answer *= 2;
	return answer%M;
}


void solve()
{
	int n;
	cin>>n;
	int size = 1e6+1;
	bool isprime[size];
	fill(isprime, isprime + size, true);
	isprime[0] = isprime[1] = false;
	forf(i, 2, size)
	{
		if(!isprime[i]) continue;
		primes.pb(i);
		for(int j = 2*i; j<size; j+= i)
		{
			isprime[j] = false;
		}
	}
	ll answer = 0;
	forf(i, 1, n)
	{
		answer = (2*answer)%M;
		answer += nof(i);
		answer %= M;
		//cout<<answer<<endl;
	}
	cout<<(answer+nof(n))%M<<endl;
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	solve();
	return 0;
}
