#include int x,y,i,l; int a,b,c,a1,b1,c1,a2,b2,c2; #define CISLO 500 int z[CISLO+5]; void map(int x, int *a, int *b, int *c) { int i,k,s,o,total; *a=0; *b=0; *c=0; if (x==1) return; total=1; for (i=1;;i++) { if (total+6*i>=x) break; total+=6*i; } k=i; o=x-total-1; s=o/i; o=(o%i)+1; switch(s) { case 0: *a=o; *c=o-k; break; case 1: *a=k-o; *b=o; break; case 2: *b=k-o; *c=o; break; case 3: *a=-o; *c=k-o; break; case 4: *a=o-k; *b=-o; break; case 5: *b=k-o; *c=-o; break; } } void prinasob(int *x, int c) { int i; for (i=0;i=0;i--) { c=(1000*c)+x[i]; x[i]=c/d; c=c%d; } } int hmin(int a, int b) { if (a>0) { return a0?a:-a; } int main() { while(1) { scanf("%d %d",&x,&y); if (x==0 && y==0) break; map(x,&a1,&b1,&c1); map(y,&a2,&b2,&c2); a=a1-a2; b=b1-b2; c=c1-c2; a+=b; c+=b; b=0; if (a*c>0) { b=hmin(a,c); a-=b; c-=b; } a=abs(a); b=abs(b); c=abs(c); l=a+b+c; memset(z,0,sizeof(z)); z[0]=1; for (i=1;i<=l;i++) prinasob(z,i); for (i=1;i<=a;i++) podel(z,i); for (i=1;i<=b;i++) podel(z,i); for (i=1;i<=c;i++) podel(z,i); for (i=CISLO-1;i>=0;i--) if (z[i]!=0) break; if (i==0 && z[0]==1) printf("There is 1 route of the shortest length %d.\n",l); else { printf("There are "); printf("%d",z[i]); for (i--;i>=0;i--) printf("%03d",z[i]); printf(" routes of the shortest length %d.\n",l); } } return 0; }