N = int(input())
A = [int(input()) for _ in range(N)]
count = 0

def insertion_sort(N, A, gap):
  for i in range(gap, N):
    value = A[i]  # 対象を取得する
    j = i - gap  # 一つ前の値を取得する
    while j >= 0 and A[j] > value:
      A[j+gap] = A[j]  # 一つずつ後ろにずらしていく
      j -= gap
      global count
      count += 1
    A[j+gap] = value  # 挿入する

def shell_sort(N, A):
  m = 0
  G = []
  num = 0
  # 3n+1(n = 0,1,2)の配列を作成する
  for i  in  range(0,N):
    num = num * 3 + 1
    if num > N:
      break
    G.append(num)
    m += 1
  G.reverse()

    
  for i in range(0, m):
    insertion_sort(N, A, G[i])
  print(str(m))
  print(' '.join(map(str, G)))
  print(str(count))
  for i in range(N):
    print(str(A[i]))

shell_sort(N, A) N = int(input()) N int(input()) int input() input int(input()) for _ in range(N) for _ in range(N) _ range(N) range N for _ in range(N) int(input()) int input() input A = [int(input()) for _ in range(N)] A [int(input()) for _ in range(N)] count = 0 count 0 def insertion_sort(N, A, gap):
  for i in range(gap, N):
    value = A[i]  # 対象を取得する
    j = i - gap  # 一つ前の値を取得する
    while j >= 0 and A[j] > value:
      A[j+gap] = A[j]  # 一つずつ後ろにずらしていく
      j -= gap
      global count
      count += 1
    A[j+gap] = value  # 挿入する insertion_sort for i in range(gap, N):
    value = A[i]  # 対象を取得する
    j = i - gap  # 一つ前の値を取得する
    while j >= 0 and A[j] > value:
      A[j+gap] = A[j]  # 一つずつ後ろにずらしていく
      j -= gap
      global count
      count += 1
    A[j+gap] = value  # 挿入する i range(gap, N) range gap N value = A[i] value A[i] A i j = i - gap j i - gap i gap while j >= 0 and A[j] > value:
      A[j+gap] = A[j]  # 一つずつ後ろにずらしていく
      j -= gap
      global count
      count += 1
     j >= 0 and A[j] > value j >= 0 j 0 A[j] > value A[j] A j value A[j+gap] = A[j] A[j+gap] A j+gap j gap A[j] A j j -= gap j gap global count count += 1 count 1 A[j+gap] = value A[j+gap] A j+gap j gap value N N A A gap gap def shell_sort(N, A):
  m = 0
  G = []
  num = 0
  # 3n+1(n = 0,1,2)の配列を作成する
  for i  in  range(0,N):
    num = num * 3 + 1
    if num > N:
      break
    G.append(num)
    m += 1
  G.reverse()

    
  for i in range(0, m):
    insertion_sort(N, A, G[i])
  print(str(m))
  print(' '.join(map(str, G)))
  print(str(count))
  for i in range(N):
    print(str(A[i])) shell_sort m = 0 m 0 G = [] G [] num = 0 num 0 for i  in  range(0,N):
    num = num * 3 + 1
    if num > N:
      break
    G.append(num)
    m += 1
   i range(0,N) range 0 N num = num * 3 + 1 num num * 3 + 1 num * 3 num 3 1 if num > N:
      break
     num > N num N break G.append(num) G.append G append num m += 1 m 1 G.reverse() G.reverse G reverse for i in range(0, m):
    insertion_sort(N, A, G[i])
   i range(0, m) range 0 m insertion_sort(N, A, G[i]) insertion_sort N A G[i] G i print(str(m)) print str(m) str m print(' '.join(map(str, G))) print ' '.join(map(str, G)) ' '.join ' ' join map(str, G) map str G print(str(count)) print str(count) str count for i in range(N):
    print(str(A[i])) i range(N) range N print(str(A[i])) print str(A[i]) str A[i] A i N N A A shell_sort(N, A) shell_sort N A def insertion_sort(N, A, gap):
  for i in range(gap, N):
    value = A[i]  # 対象を取得する
    j = i - gap  # 一つ前の値を取得する
    while j >= 0 and A[j] > value:
      A[j+gap] = A[j]  # 一つずつ後ろにずらしていく
      j -= gap
      global count
      count += 1
    A[j+gap] = value  # 挿入する def insertion_sort(N, A, gap):
  for i in range(gap, N):
    value = A[i]  # 対象を取得する
    j = i - gap  # 一つ前の値を取得する
    while j >= 0 and A[j] > value:
      A[j+gap] = A[j]  # 一つずつ後ろにずらしていく
      j -= gap
      global count
      count += 1
    A[j+gap] = value  # 挿入する insertion_sort def shell_sort(N, A):
  m = 0
  G = []
  num = 0
  # 3n+1(n = 0,1,2)の配列を作成する
  for i  in  range(0,N):
    num = num * 3 + 1
    if num > N:
      break
    G.append(num)
    m += 1
  G.reverse()

    
  for i in range(0, m):
    insertion_sort(N, A, G[i])
  print(str(m))
  print(' '.join(map(str, G)))
  print(str(count))
  for i in range(N):
    print(str(A[i])) def shell_sort(N, A):
  m = 0
  G = []
  num = 0
  # 3n+1(n = 0,1,2)の配列を作成する
  for i  in  range(0,N):
    num = num * 3 + 1
    if num > N:
      break
    G.append(num)
    m += 1
  G.reverse()

    
  for i in range(0, m):
    insertion_sort(N, A, G[i])
  print(str(m))
  print(' '.join(map(str, G)))
  print(str(count))
  for i in range(N):
    print(str(A[i])) shell_sort N = int(input()) int(input()) N count = 0 0 count A = [int(input()) for _ in range(N)] [int(input()) for _ in range(N)] A
N = int(input())
A = [int(input()) for _ in range(N)]
count = 0

def insertion_sort(N, A, gap):
  for i in range(gap, N):
    value = A[i]  # 対象を取得する
    j = i - gap  # 一つ前の値を取得する
    while j >= 0 and A[j] > value:
      A[j+gap] = A[j]  # 一つずつ後ろにずらしていく
      j -= gap
      global count
      count += 1
    A[j+gap] = value  # 挿入する

def shell_sort(N, A):
  m = 0
  G = []
  num = 0
  # 3n+1(n = 0,1,2)の配列を作成する
  for i  in  range(0,N):
    num = num * 3 + 1
    if num > N:
      break
    G.append(num)
    m += 1
  G.reverse()

    
  for i in range(0, m):
    insertion_sort(N, A, G[i])
  print(str(m))
  print(' '.join(map(str, G)))
  print(str(count))
  for i in range(N):
    print(str(A[i]))

shell_sort(N, A)
