#include using namespace std; template class disjoint_sparse_table{ bool c; static constexpr size_t stage = N < 2 ? 1 : std::numeric_limits::digits - __builtin_clzll(N-1); T *arr[stage]; T (*fn)(T, T); void construct(){ size_t w = 2, l, r; for(size_t s=2;s<=stage;++s){ w <<= 1; for(size_t i=0;il;--j) arr[stage-s][j-1] = fn(arr[stage-1][j-1], arr[stage-s][j]); l = i + w / 2; r = std::min(N - 1, i + w -1); if(l >= N || l > r) continue; arr[stage-s][l] = arr[stage-1][l]; for(size_t j=l+1;j<=r;++j) arr[stage-s][j] = fn(arr[stage-s][j-1], arr[stage-1][j]); } } c = true; } public: disjoint_sparse_table(T(*f)(T, T)): c(false), fn(f){ for(size_t s=0;s= right || right > N) return ident; if(left+1 == right) return arr[stage-1][left]; if(!c) construct(); --right; auto s = std::numeric_limits::digits - __builtin_clzll(left ^ right); return fn(arr[stage-s][left], arr[stage-s][right]); } }; int main(){ cin.tie(nullptr); ios::sync_with_stdio(false); int n; disjoint_sparse_table dst{[](auto x, auto y){ return gcd(x, y); }}; cin >> n; for(int i=0;i> dst[i]; for(int i=n;i<500000;++i) dst[i] = 0; int64_t ans = 0; for(int i=0;i 1){ int m = (l+r)/2; if(dst.query(i, m+1) == 1) r = m; else l = m; } ans += n-r; } cout << ans << endl; return 0; }