#include int pa2re1(int i, int j, int n); int po(int i, int j); int pa2re2(int i, int j, int n); int bi(int i, int j); int pa(int i, int j, int n); main() { int m=11; int vpa; int vpa2re2; int bipa; int bipa2re2; for(int n=m-2;n<=2*(m-1)+m-2;n++) { vpa=pa(1,m,n); vpa2re2=pa2re2(1,m,n); bipa=bi((m-1)*2+m-2,n); bipa2re2=bi((m-1)*2,n); printf("%2d %12d %12d %10f %12d %12d %10f\n",n, vpa,bipa,(double)vpa/bipa, vpa2re2,bipa2re2,(double)vpa2re2/bipa2re2); } } int pa(int i, int j, int n) { if(!(n>=0 && j>i && i>=1)) return 0; if(n2*(j-i)+j-i-1) return 0; int v=0; v+=pa2re2(i,j,n); for(int k=i+1;k<=j-1;k++) { for(int nn=k-i-1;nn<=n-1-(j-k-1);nn++) v += pa2re2(i,k,nn) * pa(k,j,n-1-nn); } return v; } int pa2re2(int i, int j, int n) { if(!(n>=0 && j>i && i>=1)) return 0; if(n2*(j-i)) return 0; if(j-i==1) { if(n==0) return 1; else if(n==1) return 2; else if(n==2) return 1; else 0; } int v=0; v+=pa2re1(i,j,n); v+=pa2re2(i+1,j,n-2); v+=pa2re1(i,j-1,n-2); for(int k=i+1;k<=j-2;k++) { v+=pa2re1(i,k,k-i) * pa2re2(k+1,j,n-2-(k-i)); v+=pa2re1(i,k,k-i-1) * pa2re2(k+1,j,n-2-(k-i-1)); } return v; } int pa2re1(int i, int j, int n) { //two original packets at positions i and j and n redundant packets //but no more than one redundant packet for each pair if(!(n>=0 && j>i && i>=1)) return 0; if(n==j-i) return 1*po(2,j-i); else if(n==j-i-1) return (j-i)*po(2,j-i-1); else return 0; } int po(int i, int j) { int v = 1; for(int jj=1;jj<=j;jj++) v*=i; return v; } int bi(int i, int j) { if(!(i>=j && j>=0)) return 0; if(i==0) return 1; if(j==0) return 1; return bi(i,j-1)*(i-j+1)/j; }