import java.util.AbstractSet; import java.util.Iterator; import java.util.Scanner; import java.util.Set; import java.util.TreeSet; public class Factorial { public static void main(String[] args) { Scanner in = new Scanner(System.in); final int n = in.nextInt(); Set primes = new IntSparseSet(2, n+1) {{ for (int i = 2; i <= n; i++) add(i); for (int i = 2; i*i <= n; i++) { if (contains(i)) { for (int j = i*i; j <= n; j += i) remove(j); } } }}; for (int x : new TreeSet(primes)) { System.out.printf("%d ", x); } System.out.println(); } } class IntSparseSet extends AbstractSet { public int low, high, n; public int[] sparse, dense; public IntSparseSet(int l, int h) { low = l; high = h; sparse = new int[h-l]; dense = new int[h-l]; n = 0; for(int i=0;i=n || dense[sparse[x]] != x) { dense[n] = x; sparse[x] = n; n++; return true; } return false; } @Override public void clear(){ n = 0; } @Override public boolean contains(Object x){ x=(Integer)x-low; if(sparse[(Integer)x] < n && dense[sparse[(Integer)x]] == (Integer)x) return true; else return false; } @Override public boolean remove(Object x){ x=(Integer)x-low; if(sparse[(Integer)x] <= n-1 && dense[sparse[(Integer)x]] == (Integer)x){ dense[sparse[(Integer)x]] = dense[n-1]; sparse[dense[n-1]] = sparse[(Integer)x]; n--; return true; } return false; } @Override public int size(){ return n; } class Iter implements Iterator{ int i = 0; @Override public Integer next(){ return dense[i++]+low; } @Override public boolean hasNext(){ return i < n; } @Override public void remove(){ IntSparseSet.this.remove(dense[i - 1] + low); } } @Override public Iterator iterator(){ return new Iter(); } }