n = gets(chomp:true).to_i

a = []
n.times{ a << gets(chomp:true).to_i }
@cnt = 0

def insertion_sort(a, n, g_itv)
  # 操作要素番号(i_ope_idx)
  (g_itv...n).each do |i_ope_idx|

    # 操作要素を一旦プール要素に格納(v_pol_elm)
    v_pol_elm = a[i_ope_idx]

    # 操作要素番号の左の比較要素番号(j_cmp_idx)
    j_cmp_idx = i_ope_idx - g_itv

    # 比較要素番号が配列の最初以上かつ、比較要素がプール要素（操作要素)より大きい場合
    while j_cmp_idx >= 0 && a[j_cmp_idx] > v_pol_elm

      # 比較要素を右へコピー（入れ替え）
      a[j_cmp_idx + g_itv] = a[j_cmp_idx]

      # 比較要素番号を間隔分左にずらす
      j_cmp_idx = j_cmp_idx - g_itv

      @cnt += 1
    end

    # 比較終了時番号の右にプール要素を戻す
    a[ j_cmp_idx + g_itv ] = v_pol_elm
  end
end

def shell_sort(a, n)

  @g = []
  h = 1

  until h > n
    @g.unshift(h)
    h = h*3 + 1
  end

  @g.each do |i|
    insertion_sort(a, n, i)
  end
end


shell_sort(a, n)

puts @g.size
puts @g.join(" ")
puts @cnt
n.times do |i|
  puts a[i]
end
