#include <bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
typedef long long ll;
typedef long double ld;
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define mod 1000000007
#define pii pair<ll,ll>
#define inf 1000000000000000000
#define bpc(x) __builtin_popcountll(x)
#define autoit(x,it) for(auto it = x.begin(); it != x.end(); it++)
#define autoitr(x,it) for(auto it = x.rbegin(); it != x.rend(); it++)
#define rep(n) for(ll i = 0; i < n; i++)
#define repi(i,n) for(ll i = 0; i < n; i++)

#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 
using namespace __gnu_pbds; 

#define ordered_set tree<ll, null_type,less<ll>, rb_tree_tag,tree_order_statistics_node_update> 

using namespace std;
mt19937_64 mt(chrono::steady_clock::now().time_since_epoch().count());

int main()
{
  FAST/**/
  
  ll n;
  cin>>n;
  vector<ll> divi[n+1];
  for(ll i=1;i<n;i++)
        for(ll j=2*i;j<=n;j+=i)
            divi[j].pb(i);
  
  ll val[n+1];
  memset(val,0,sizeof(val));
  
  set<ll, greater<ll>> st;
  for(ll i=1;i<=n;i++)
        st.insert(i);
  while(st.size()>0)
  {
      auto curr = *st.begin();
      st.erase(st.begin());
      
      autoit(divi[curr], it)
      {
          if(val[*it] > val[curr]-1)
              val[*it] = val[curr]-1;
      }
  }
  
  ll maxi = 0;
  for(ll i=1;i<=n;i++)
        maxi = min(maxi, val[i]);
  maxi--;
  for(ll i=1;i<=n;i++)
        val[i]-=maxi;
  for(ll i=1;i<=n;i++)
        cout<<val[i]<<" ";
  
  return 0;
}
   
   
 
#include<bits/stdc++.h>
using namespace std;
#define f(i,a,b) for(ll i=a; i<b; i++)
#define fr(i,a,b) for(ll i=a; i>=b; i--)

typedef vector<int> vi;
typedef long long int ll;
typedef vector<ll> vll;
#define fastio std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define PI 3.1415926535
ll Mod = 1e9+7;
// ll Mod = 998244353;

// ll mult(ll a, ll b) {
//     ll ret = 1;
//     ret = ((a%Mod) * (b%Mod))%Mod;
//     return ret;
// }

// ll power(ll a, ll b = Mod-2) {
//     if(b == 0) return 1;
//     ll ret = 1;
//     while(b) {
//         if(b&1) {
//             ret = mult(ret,a);
//         }
//         a = mult(a,a);
//         b>>=1;
//     }
//     return ret;
// }

// ll sub(ll a, ll b) {
//     ll ret = (a%Mod - b%Mod + Mod)%Mod;
//     return ret;
// }

// void seive(vector<bool> &status) {
//      for(ll i = 2; i<=1e6; i++) {
//          if(status[i]) {
//                 for(ll j =i*i; j<=1e6; j+=i) status[j] = 0;
//          }
//      }
//  }

// int getmex(vi& occr, int n, int mex) {
//     for(int i = mex; i<n; i++) {
//         if(occr[i] == 0) return i;
//     }
//     return n;
// }

// void swap(int &a, int &b) {
//     a = a + b;
//     b = a - b; 
//     a = a - b;
// }

void solve_case() {
    int n;
    cin>>n;

    f(i,1,n+1) {
        fr(j,31,0) {
            if(i&(1<<j)) {
                cout<<j+1<<' ';
                break;
            }
        }
    }
}



int main() {
	#ifndef ONLINE_JUDGE
		freopen("input.txt","r",stdin);
		freopen("output.txt","w",stdout);
	#endif

	fastio;
    // vector<bool> status(1e6+1,1);
    int t = 1;
    // vll primes;
    // seive(status);
    // f(i,2, 1e6+1) {
    //     if(status[i]) primes.push_back(i);
    // } 
    // cin>>t;
    while(t--) {
        solve_case();
    }
}