// Author: Manfred Scheucher // Date : 06.06.2015 #include <stdio.h> #include <stdlib.h> #define MAXN 20 int X[MAXN]; int subs[MAXN]; int tails[MAXN]; int n; long ct=0; int c1 = 0; int l1 = 0; int recliscount(int len,int k) { int l; if(len >= l1) { if(len>l1) { l1 = len; c1 = 0; } c1++; } for(l=k+1;l<n;l++) { if(X[k]<X[l]) { recliscount(len+1,l); } } } int perm(int k) { int j,x; if(k==n) { l1=0; for(j=0;j<=n-l1;j++) recliscount(1,j); ct+=c1; } else { for(x=0;x<n;x++) { for(j=0;j<k;j++) { if(x==X[j]) { j=-1; break; } } if(j>=0) { X[k]=x; perm(k+1); } } } } int main(int argc,char** argv) { n = atoi(argv[1]); perm(0); printf("%d %ld\n",n,ct); }