// Best practice
 
#include<bits/stdc++.h>
 
#define int         long long
#define pb          push_back
#define pf          emplace_front
#define all(a)      (a).begin(),(a).end()
#define rall(a)     (a).rbegin(),(a).rend()
#define pii 		pair<int,int>
#define psi 		pair<string,int>
#define vi 			vector<int>
#define vpii  		vector<pii>
#define vvi 		vector<vi>
#define sz(x)	    (int)(x).size()
#define x           first
#define y           second
#define endl        '\n'
#define tezz        ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define MOD         1000000007
#define hell        998244353
#define prec(n) 	fixed<<setprecision(n)
#define ini(a, i) 	memset(a, i, sizeof(a))
#define output(x)   cout << (x ? "YES" : "NO")<<endl;
using namespace std;
 
#define debug(vec) cout<<(#vec)<<" : [ "; for (auto& i: vec) cout<<i<<" "; cout<< "]" << endl
#define debugp(vec) cout<<(#vec)<<" : [ "; for (auto& i: vec) cout<<"("<<i.x<<","<<i.y<<")"<<" "; cout<< "]" << endl
#define trace(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args);cout << endl; }
void err(istream_iterator<string> it) {}
template<typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
    cout << "[" << *it << ": " << a << "]\t";
    err(++it, args...);
}
 
// const int dx[4] = { -1, 1, 0, 0};
// const int dy[4] = {0, 0, -1, 1};
// int dX[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
// int dY[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
 
 
// Code from Here -------------------------------------------------------------------------------

// const int nax=1e6+5;
// int dp[nax], is[nax];
// vi prime;

// int spf[MAXN]; 
  
// // Calculating SPF (Smallest Prime Factor) for every 
// // number till MAXN. 
// // Time Complexity : O(nloglogn) 
// void sieve() 
// { 
//     spf[1] = 1; 
//     for (int i=2; i<MAXN; i++) 
  
//         // marking smallest prime factor for every 
//         // number to be itself. 
//         spf[i] = i; 
  
//     // separately marking spf for every even 
//     // number as 2 
//     for (int i=4; i<MAXN; i+=2) 
//         spf[i] = 2; 
  
//     for (int i=3; i*i<MAXN; i++) 
//     { 
//         // checking if i is prime 
//         if (spf[i] == i) 
//         { 
//             // marking SPF for all numbers divisible by i 
//             for (int j=i*i; j<MAXN; j+=i) 
  
//                 // marking spf[j] if it is not  
//                 // previously marked 
//                 if (spf[j]==j) 
//                     spf[j] = i; 
//         } 
//     } 
// } 

// void getFactorization(int x) 
// { 
//     vector<int> ret; 
//     while (x != 1) 
//     { 
//         ret.push_back(spf[x]);
//         x = x / spf[x]; 
//     }    
//     return ret; 
// } 

// int count(int x){
// 	int ans=1;
// 	for(auto it: prime){
// 		if(x<=0)break;
// 		int c=0;
// 		while(x%it==0){
// 			c++;
// 			x/=it;
// 		}
// 		ans *= (c+1);
// 		// trace(ans);
// 	}
// 	return ans;
// }

signed main() {
	tezz
 
	int n;
	cin >> n;
	int ans = 0;
	// ini(is, 1);
	// is[0] = is[1] = 0;
	// for(int i=2; i*i<=nax; i++){
	// 	if(is[i] == 1){
	// 		for(int j=i*i; j<nax; j+=i){
	// 			is[j]=0;
	// 		}
	// 	}
	// }
	// for(int i=2; i<nax; i++){
	// 	if(is[i]){
	// 		prime.pb(i);
	// 	}
	// }	
	// for(int i=1; n-i>0; i++){
	// 	int x = n-i;
	// 	ans += count(x);
	// 	// trace(x, ans);
	// }

	for(int i=1; i<n; i++){		
		for(int j=1; j<n; j++){
			int c = n-i*j;
			if(c<=0)break;
			ans++;
		}
	}
	cout << ans << endl;
 
	return 0;
}  

Measured memory_bytes: 3648