#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cmath>
#include <vector>
#include <sstream>
#include <string>
#include <cstdio>
#include <array>

using namespace std;

//???????????°??????TEST????????????????????¬???????????????????????????????????¢????????????
//#define TEST //*******************************************************************************************************************************************

//?????????????????¨??§?????\????????????????????????????????°?????????????¨???????????????????dout???????????????????????§???????????¬??????????????????????????????????????????
//#ifdef TEST
//    #define dout cout
//#else
//    stringstream dummy; //???????????°??????dout?????????????????????????????????
//    #define dout dummy
//#endif


//?????????????????´??°????´???°?????????????????????
bool isPrime(int x) {
    if( x<=1 ) return false;
    if( x==2 ) return true;
    if( x%2==0 ) return false;
    
    for(int i=3; i<=sqrt(x); i+=2) {
        if( x%i==0 ) return false;
    }
    return true;
}


//?????\????????????gap?????????
int insertionSort(int a[], int numOfData, int gap) {
    int cnt = 0; //??????????????°??????????????¨
    
    for(int i=gap; i<numOfData; i++) {

//        //display a[]
//        for(int k=0; k<numOfData; k++) {
//            if(k==i) dout << "|";
//            if(k==0) dout << a[k];
//            else dout << " " << a[k];
//            
//        }
//        dout << endl;
        
        //sort procedure
        int key = a[i];

        int j;
        for(j=i-gap; j>=0 && a[j]>key; j-=gap) {
            a[j+gap] = a[j];
            cnt++;
        } //end of j-loop
        
        a[j+gap] = key;
        
    } //end of i-loop
    
    return cnt;
}



int main(void) {
    int numOfData;
    cin >> numOfData;
    
    //input data
    int a[numOfData];
    for(int i=0; i<numOfData; i++) {
        cin >> a[i];
    }
    
//    dout << "<Before>\n";
//    //display a[]
//    for(int i=0; i<numOfData; i++) {
//        if(i==0) dout << a[i];
//        else dout << " " << a[i];
//    }
//    dout << endl;

//    //calc. gap[]
//    //numOfData????¶???????????´???°????????§?????£?????????
//    vector<int> gap;
//    gap.push_back(1);
//    for(int i=2; i<numOfData; i++) {
//        if( isPrime(i) ) {
//            gap.push_back(i);
//        }
//    }
//    reverse(gap.begin(), gap.end()); //?????????????????????
    
    //calc. gap[]
    //?´???°??§??????????????£????????§???Wikipedia????????????3n+1?????°?????§??????
    vector<int> gap;
    gap.push_back(1);
    int i = 1;
    while( (i=3*i+1) < numOfData ) {
        gap.push_back( i );
    }
    reverse(gap.begin(), gap.end()); //?????????????????????

    //display gap[]
//    dout << "g.size = ";
    cout << gap.size() << endl;
//    dout << "g[] = ";
    for(int i=0; i<gap.size(); i++) {
        if(i==0) cout << gap[i];
        else cout << " " << gap[i];
    }
    cout << endl;
    
//    dout << "Shell Sort\n";
    int computationalComplexity = 0;
    for(int i=0; i<gap.size(); i++) {
//        dout << "gap[" << i << "] = " << gap[i] << endl;
        computationalComplexity += insertionSort(&a[0], numOfData, gap[i]);
//        dout << "?¨??????? = " << computationalComplexity << endl;
    }
    
    
    //?¨????????????????
//    dout << "Max??¶?????? n^1.5 = " << pow(numOfData, 1.5) << " / ";
//    dout << "??????????¨??????? = ";
    cout << computationalComplexity << endl;
    
//    dout << "<After>\n";
    //display a[]
    for(int i=0; i<numOfData; i++) {
        cout << a[i] << endl;
    }
    
    
    return 0;
}

Measured memory_bytes: 6988