#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>

#include <algorithm>
#include <bitset>
#include <complex>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

#include <cassert>
#include <functional>

typedef long long ll;
using namespace std;

#ifndef LOCAL
#define debug(...) ;
#else
#define debug(...) cerr << __LINE__ << " : " << #__VA_ARGS__ << " = " << _tostr(__VA_ARGS__) << endl;

template<typename T>
ostream &operator<<(ostream &out, const vector<T> &v);

template<typename T1, typename T2>
ostream &operator<<(ostream &out, const pair<T1, T2> &p) {
  out << "{" << p.first << ", " << p.second << "}";
  return out;
}

template<typename T>
ostream &operator<<(ostream &out, const vector<T> &v) {
  out << '{';
  for (const T &item : v) out << item << ", ";
  out << "\b\b}";
  return out;
}

void _tostr_rec(ostringstream &oss) {
  oss << "\b\b \b";
}

template<typename Head, typename... Tail>
void _tostr_rec(ostringstream &oss, Head &&head, Tail &&...tail) {
  oss << head << ", ";
  _tostr_rec(oss, forward<Tail>(tail)...);
}

template<typename... T>
string _tostr(T &&...args) {
  ostringstream oss;
  int size = sizeof...(args);
  if (size > 1) oss << "{";
  _tostr_rec(oss, forward<T>(args)...);
  if (size > 1) oss << "}";
  return oss.str();
}
#endif

#define mod 1000000007 //1e9+7(prime number)
#define INF 1000000000 //1e9
#define LLINF 2000000000000000000LL //2e18
#define SIZE 200010

int f(int x, int N) {
  for (int i = 10; i >= 0; i--) {
    if (x >= N && (x & (1 << i))) {
      x -= 1 << i;
    }
  }
  return x;
}

int main() {
  int N;

  scanf("%d", &N);

  for (int i = 0; i < N; i++) {
    int a = f(i * 2 + 0, N);
    int b = f(i * 2 + 1, N);
    printf("%d %d\n", a + 1, b + 1);
  }

  return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define rep2(i,j,n) for (int i=j; i <=(int)(n); i++)

int a[100010];

int main() {
	int n,m,p,q;

	cin >> n;

	rep2(i,1,n)a[i]=1;
	if(n==1){
		cout << 1 << endl;
		return 0;
	}
	m=n/2+1;
	rep2(i,1,m){
		p=i+i;
		q=a[i];
		while (p<=n) {
			if (a[p]==q)a[p]++;
			p+=i;
		}
	}
	rep2(i,1,n){
		cout << a[i] << " ";
	}
	return 0;
}