#include int poleX[1200000]; int poleY[1200000]; #define numssize 1000 int nums[numssize]; #define base 1000 #define MAX 1000000 #define save poleX[n]=x; poleY[n]=y; n++; #define max(a, b) (((a)>(b)) ? (a) : (b)) #define min(a, b) (((a)<(b)) ? (a) : (b)) void init() { int n=2; int x=-1; int y=0; int r=0; save; while (n=0) return 1; return 0; } int length(int x, int y); void nuluj() { for (int i=0; i0; i--) { nums[i-1] += (nums[i] % f) * base; nums[i] /= f; } nums[0] /= f; } void routes(int x, int y) { int x1 = poleX[x]; int x2 = poleX[y]; int y1 = poleY[x]; int y2 = poleY[y]; int n = length(x, y); int k = min(abs(y2-y1), abs(x2-x1)); k = min (k, n-k); if (k==0) { printf("is 1 route"); return; } printf("are "); nuluj(); for (int i=n; i>k; i--) { times(i); divide(n-i+1); } int i=numssize; while (nums[i]==0) i--; printf ("%d", nums[i]); i--; while (i>=0) { printf ("%03d", nums[i]); i--; } printf(" routes"); } int length(int x, int y) { // printf("%d [%d %d], %d [%d %d]\n", x, poleX[x], poleY[x], y, poleX[y], poleY[y]); int result; int x1 = poleX[x]; int x2 = poleX[y]; int y1 = poleY[x]; int y2 = poleY[y]; if ((x2-x1>=0 && y2-y1>=0) ||(x2-x1<=0 && y2-y1<=0)) result = abs(y2-y1)+abs(x2-x1); else result = max(abs(y2-y1), abs(x2-x1)); return result; } int main() { init(); int x, y; scanf("%d%d", &x, &y); while (x!=0 && y!=0) { // printf("%d %d ", x, y); printf("There "); routes(x, y); printf(" of the shortest length %d.\n", length(x, y)); scanf("%d%d", &x, &y); } return 0; }