def insertionSort(A,n,g):#cを引数に入れる方針では更新が怒らないらしい
    global c #ここにglobal cを置くことでmainからcの値を変更可能になる.c=0と書くと(ローカル宣言したのでこの瞬間からcがlocalになり、mainのcと別物になる)
    #print(tp[2])の結果はmainのc=0のグローバル宣言の影響を受け0のままになる
    for i in range(g,n):
        v=A[i]
        j = i - g
        while j >= 0 and A[j] >v:
            A[j+g] = A[j]
            j = j- g
            c+=1
            #print(c)
        A[j+g] = v
def shellSort(A,n): #ローカルスコープ
    i = 0
    G=[1]
    while 3*G[i]+1 < n :
        G.append(3*G[i]+1)
        #print("\n")
        i+=1
    G.reverse()
    m=len(G)
    for i in range(m):#シェルソーとは3G[i]+1の感覚がだんだん狭まっていくように
       insertionSort(A,n,G[i])
    return m,G,c,A#ここにc書いてもエラー出されないのはglobalのおかげなんだろうか←main関数内のc=0の定義のおかげ
#この関数内でcに代入がされた時点でcはローカル変数になっていたが、ここでは何も代入してないのでmainのglobal宣言が生きる
"""
def test():
    return 'abc', 100
"""
#Pythonにおいて、構文上必要な場合を除き、カンマで区切られた値は
# 丸括弧を省略したタプルとみなされる。このため、上の例の関数はそれぞれの値を要素とするタプルを返すことになる。

if __name__=="__main__":#グローバルスコープ
    c = 0#ここで各関数実行前にcをかけばglobal変数になる
    n = int(input())
    l = [int(input().rstrip()) for _ in range(n)]
    tp = shellSort(l,n)
    print(tp[0])
    #print(tp[1])
    a = [str(tp[1][i]) for i in range(len(tp[1]))]
    #print(a)
    print(' '.join(a))
    print(tp[2])
    for i in range(len(tp[3])):
        print(tp[3][i]) def insertionSort(A,n,g):#cを引数に入れる方針では更新が怒らないらしい
    global c #ここにglobal cを置くことでmainからcの値を変更可能になる.c=0と書くと(ローカル宣言したのでこの瞬間からcがlocalになり、mainのcと別物になる)
    #print(tp[2])の結果はmainのc=0のグローバル宣言の影響を受け0のままになる
    for i in range(g,n):
        v=A[i]
        j = i - g
        while j >= 0 and A[j] >v:
            A[j+g] = A[j]
            j = j- g
            c+=1
            #print(c)
        A[j+g] = v insertionSort global c for i in range(g,n):
        v=A[i]
        j = i - g
        while j >= 0 and A[j] >v:
            A[j+g] = A[j]
            j = j- g
            c+=1
            #print(c)
        A[j+g] = v i range(g,n) range g n v=A[i] v A[i] A i j = i - g j i - g i g while j >= 0 and A[j] >v:
            A[j+g] = A[j]
            j = j- g
            c+=1
            #print(c)
         j >= 0 and A[j] >v j >= 0 j 0 A[j] >v A[j] A j v A[j+g] = A[j] A[j+g] A j+g j g A[j] A j j = j- g j j- g j g c+=1 c 1 A[j+g] = v A[j+g] A j+g j g v A A n n g g def shellSort(A,n): #ローカルスコープ
    i = 0
    G=[1]
    while 3*G[i]+1 < n :
        G.append(3*G[i]+1)
        #print("\n")
        i+=1
    G.reverse()
    m=len(G)
    for i in range(m):#シェルソーとは3G[i]+1の感覚がだんだん狭まっていくように
       insertionSort(A,n,G[i])
    return m,G,c,A#ここにc書いてもエラー出されないのはglobalのおかげなんだろうか←main関数内のc=0の定義のおかげ
#この関数内でcに代入がされた時点でcはローカル変数になっていたが、ここでは何も代入してないのでmainのglobal宣言が生きる shellSort i = 0 i 0 G=[1] G [1] 1 while 3*G[i]+1 < n :
        G.append(3*G[i]+1)
        #print("\n")
        i+=1
     3*G[i]+1 < n 3*G[i]+1 3*G[i] 3 G[i] G i 1 n G.append(3*G[i]+1) G.append G append 3*G[i]+1 3*G[i] 3 G[i] G i 1 i+=1 i 1 G.reverse() G.reverse G reverse m=len(G) m len(G) len G for i in range(m):#シェルソーとは3G[i]+1の感覚がだんだん狭まっていくように
       insertionSort(A,n,G[i])
     i range(m) range m insertionSort(A,n,G[i]) insertionSort A n G[i] G i return m,G,c,A return m,G,c,A m G c A A A n n """
def test():
    return 'abc', 100
""" if __name__=="__main__":#グローバルスコープ
    c = 0#ここで各関数実行前にcをかけばglobal変数になる
    n = int(input())
    l = [int(input().rstrip()) for _ in range(n)]
    tp = shellSort(l,n)
    print(tp[0])
    #print(tp[1])
    a = [str(tp[1][i]) for i in range(len(tp[1]))]
    #print(a)
    print(' '.join(a))
    print(tp[2])
    for i in range(len(tp[3])):
        print(tp[3][i]) __name__=="__main__" __name__ "__main__" c = 0 c 0 n = int(input()) n int(input()) int input() input int(input().rstrip()) for _ in range(n) for _ in range(n) _ range(n) range n for _ in range(n) int(input().rstrip()) int input().rstrip() ().rstrip () input rstrip l = [int(input().rstrip()) for _ in range(n)] l [int(input().rstrip()) for _ in range(n)] tp = shellSort(l,n) tp shellSort(l,n) shellSort l n print(tp[0]) print tp[0] tp 0 str(tp[1][i]) for i in range(len(tp[1])) for i in range(len(tp[1])) i range(len(tp[1])) range len(tp[1]) len tp[1] tp 1 for i in range(len(tp[1])) str(tp[1][i]) str tp[1][i] [1] tp 1 i a = [str(tp[1][i]) for i in range(len(tp[1]))] a [str(tp[1][i]) for i in range(len(tp[1]))] print(' '.join(a)) print ' '.join(a) ' '.join ' ' join a print(tp[2]) print tp[2] tp 2 for i in range(len(tp[3])):
        print(tp[3][i]) i range(len(tp[3])) range len(tp[3]) len tp[3] tp 3 print(tp[3][i]) print tp[3][i] [3] tp 3 i a = [str(tp[1][i]) for i in range(len(tp[1]))] [str(tp[1][i]) for i in range(len(tp[1]))] a def insertionSort(A,n,g):#cを引数に入れる方針では更新が怒らないらしい
    global c #ここにglobal cを置くことでmainからcの値を変更可能になる.c=0と書くと(ローカル宣言したのでこの瞬間からcがlocalになり、mainのcと別物になる)
    #print(tp[2])の結果はmainのc=0のグローバル宣言の影響を受け0のままになる
    for i in range(g,n):
        v=A[i]
        j = i - g
        while j >= 0 and A[j] >v:
            A[j+g] = A[j]
            j = j- g
            c+=1
            #print(c)
        A[j+g] = v def insertionSort(A,n,g):#cを引数に入れる方針では更新が怒らないらしい
    global c #ここにglobal cを置くことでmainからcの値を変更可能になる.c=0と書くと(ローカル宣言したのでこの瞬間からcがlocalになり、mainのcと別物になる)
    #print(tp[2])の結果はmainのc=0のグローバル宣言の影響を受け0のままになる
    for i in range(g,n):
        v=A[i]
        j = i - g
        while j >= 0 and A[j] >v:
            A[j+g] = A[j]
            j = j- g
            c+=1
            #print(c)
        A[j+g] = v insertionSort def shellSort(A,n): #ローカルスコープ
    i = 0
    G=[1]
    while 3*G[i]+1 < n :
        G.append(3*G[i]+1)
        #print("\n")
        i+=1
    G.reverse()
    m=len(G)
    for i in range(m):#シェルソーとは3G[i]+1の感覚がだんだん狭まっていくように
       insertionSort(A,n,G[i])
    return m,G,c,A#ここにc書いてもエラー出されないのはglobalのおかげなんだろうか←main関数内のc=0の定義のおかげ
#この関数内でcに代入がされた時点でcはローカル変数になっていたが、ここでは何も代入してないのでmainのglobal宣言が生きる def shellSort(A,n): #ローカルスコープ
    i = 0
    G=[1]
    while 3*G[i]+1 < n :
        G.append(3*G[i]+1)
        #print("\n")
        i+=1
    G.reverse()
    m=len(G)
    for i in range(m):#シェルソーとは3G[i]+1の感覚がだんだん狭まっていくように
       insertionSort(A,n,G[i])
    return m,G,c,A#ここにc書いてもエラー出されないのはglobalのおかげなんだろうか←main関数内のc=0の定義のおかげ
#この関数内でcに代入がされた時点でcはローカル変数になっていたが、ここでは何も代入してないのでmainのglobal宣言が生きる shellSort c = 0 0 c tp = shellSort(l,n) shellSort(l,n) tp l = [int(input().rstrip()) for _ in range(n)] [int(input().rstrip()) for _ in range(n)] l n = int(input()) int(input()) n
def insertionSort(A,n,g):#cを引数に入れる方針では更新が怒らないらしい
    global c #ここにglobal cを置くことでmainからcの値を変更可能になる.c=0と書くと(ローカル宣言したのでこの瞬間からcがlocalになり、mainのcと別物になる)
    #print(tp[2])の結果はmainのc=0のグローバル宣言の影響を受け0のままになる
    for i in range(g,n):
        v=A[i]
        j = i - g
        while j >= 0 and A[j] >v:
            A[j+g] = A[j]
            j = j- g
            c+=1
            #print(c)
        A[j+g] = v
def shellSort(A,n): #ローカルスコープ
    i = 0
    G=[1]
    while 3*G[i]+1 < n :
        G.append(3*G[i]+1)
        #print("\n")
        i+=1
    G.reverse()
    m=len(G)
    for i in range(m):#シェルソーとは3G[i]+1の感覚がだんだん狭まっていくように
       insertionSort(A,n,G[i])
    return m,G,c,A#ここにc書いてもエラー出されないのはglobalのおかげなんだろうか←main関数内のc=0の定義のおかげ
#この関数内でcに代入がされた時点でcはローカル変数になっていたが、ここでは何も代入してないのでmainのglobal宣言が生きる
"""
def test():
    return 'abc', 100
"""
#Pythonにおいて、構文上必要な場合を除き、カンマで区切られた値は
# 丸括弧を省略したタプルとみなされる。このため、上の例の関数はそれぞれの値を要素とするタプルを返すことになる。

if __name__=="__main__":#グローバルスコープ
    c = 0#ここで各関数実行前にcをかけばglobal変数になる
    n = int(input())
    l = [int(input().rstrip()) for _ in range(n)]
    tp = shellSort(l,n)
    print(tp[0])
    #print(tp[1])
    a = [str(tp[1][i]) for i in range(len(tp[1]))]
    #print(a)
    print(' '.join(a))
    print(tp[2])
    for i in range(len(tp[3])):
        print(tp[3][i])
