【Aizu ALDS1_2_D --- Shell Sort】
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
const int MAXN = 1000005;
int arr[MAXN];
vector<int> v;
long long cnt=0;
void insert_sort(int n,int g)
{
for(int i=g;i<n;i++)
{
int v = arr[i];
int j=i-g;
while(j>=0 && arr[j]>v)
{
arr[j+g]=arr[j];
j-=g;
cnt++;
}
arr[j+g]=v;
}
}
void shell_sort(int n)
{
cnt=0;
int x=1;
while(x<=n) v.push_back(x),x=3*x+1;
int m=v.size();
for(int i=m-1;i>=0;i--)
{
insert_sort(n,v[i]);
}
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
for(int i=0;i<n;i++)
cin >> arr[i];
shell_sort(n);
cout << v.size() << endl;
for(int i=v.size()-1;i>=0;i--)
cout << v[i] << (i==0?'\n':' ');
cout << cnt << endl;
for(int i=0;i<n;i++)
cout << arr[i] << endl;
return 0;
}