#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 10
#define STEPS 120000

int z[MAXSIZE+1];
int S1a[MAXSIZE+1];
int S1b[MAXSIZE+1];

#define divide(x,n) { int rem = 0; int j; for ( j = 0; j <= MAXSIZE; j++ ) { \
			rem *= 10000; rem += x[j]; x[j] = rem / n; rem = rem % n; } }
#define divide2(xx,x,n) { int rem = 0; int j; for ( j = 0; j <= MAXSIZE; j++ ) { \
			rem *= 10000; rem += x[j]; xx[j] = rem / n; rem = rem % n; } }
#define makezero(x) { int j; for ( j = 0; j <= MAXSIZE; j++ ) x[j] = 0; }
#define add(x,y) { int carry = 0; int j, u; for ( j = MAXSIZE; j >= 0; j-- ) { \
		u = x[j]+y[j]+carry; if ( u >= 10000 ) { carry = 1; u -= 10000; } \
		else carry = 0; x[j] = u; } }
#define sub(x,y) { int borrow = 0; int j, u; for ( j = MAXSIZE; j >= 0; j-- ) { \
		u = x[j]-y[j]-borrow; if ( u < 0 ) { u += 10000; borrow = 1; } \
		else borrow = 0; x[j] = u; } }
#define sub2(xx,x,y) { int borrow = 0; int j, u; for ( j = MAXSIZE; j >= 0; j-- ) { \
		u = x[j]-y[j]-borrow; if ( u < 0 ) { u += 10000; borrow = 1; } \
		else borrow = 0; xx[j] = u; } }
#define mult(x,y) { int j1,j2, u = 0; for ( j1 = MAXSIZE; j1 >= 0; j1-- ) { \
		for ( j2 = 0; j2 <= j1; j2++ ) u += x[j2]*y[j1-j2]; \
		x[j1] = u % 10000; u /= 10000; } }
#define mult2(xx,x,y) { int j1,j2, u = 0; for ( j1 = MAXSIZE; j1 >= 0; j1-- ) { \
		for ( j2 = 0; j2 <= j1; j2++ ) u += x[j2]*y[j1-j2]; \
		xx[j1] = u % 10000; u /= 10000; } }
#define prt(x) { int j; printf("%d.",x[0]); \
	for ( j = 1; j <= MAXSIZE; j++ ) printf("%4d",x[j]); }
#define prt2(x) { int j; printf("%d.",x[0]); \
	for ( j = 1; j <= MAXSIZE; j++ ) printf("%4d",x[j]); printf("\n"); }

int main()
{
	int one[MAXSIZE+1],two[MAXSIZE+1],three[MAXSIZE+1],four[MAXSIZE+1];
	int i,ii,rem;
	makezero(z)
	makezero(S1a)
	makezero(S1b)
	for ( i = 1; i <= STEPS; i++ ) {
		makezero(one)
		one[0] = 1;
		divide(one,i)
		divide(one,i)
		divide(one,i)
		divide(one,i)
		divide(one,i)

		makezero(three)
		three[0] = 1;
		divide(three,i)
		if ( i%2 != 0 ) {
			add(S1a,three)
		}
		else {
			sub(S1a,three)
		}
		makezero(three)
		three[0] = 1;
		divide(three,i)
		mult(three,S1a)
		if ( i%2 != 0 ) {
			add(S1b,three)
		}
		else {
			sub(S1b,three)
		}
		mult(one,S1b);
		add(z,one)
		if ( i%1000 == 0 ) {
			printf("z: ");
			prt2(z)
		}
	}
	printf("z: ");
	prt2(z)
	return(0);
}

#ifdef FORMmin511
int main()
{
	int one[MAXSIZE+1],two[MAXSIZE+1],three[MAXSIZE+1],four[MAXSIZE+1];
	int i,ii,rem;
	makezero(z)
	makezero(S1a)
	makezero(S1b)
	for ( i = 1; i <= STEPS; i++ ) {
		makezero(one)
		one[0] = 1;
		ii = 2*i-1;
		divide(one,ii)
		divide(one,ii)
		divide(one,ii)
		divide(one,ii)
		divide(one,ii)
		makezero(two)
		two[0] = 1;
		ii = 2*i;
		divide(two,ii)
		divide(two,ii)
		divide(two,ii)
		divide(two,ii)
		divide(two,ii)
		sub(one,two)

		makezero(three)
		three[0] = 1;
		ii = 2*i-1;
		divide(three,ii)
		add(S1a,three)
		divide2(four,S1a,ii)
		add(S1b,four)

		makezero(three)
		three[0] = 1;
		ii = 2*i;
		divide(three,ii)
		add(S1a,three)
		divide2(four,S1a,ii)
		add(S1b,four)

		mult(one,S1b);
		add(z,one)

		makezero(one)
		one[0] = 1;
		ii = 2*i-1;
		divide(one,ii)
		divide(one,ii)
		divide(one,ii)
		divide(one,ii)
		divide(one,ii)
		ii = 2*i;
		divide(one,ii)
		mult(one,S1a)
		sub(z,one)

		if ( i%1000 == 0 ) {
			printf("z: ");
			prt2(z)
		}
	}
	printf("z: ");
	prt2(z)
	return(0);
}
#endif
#ifdef FORmin5min1
int main()
{
	int one[MAXSIZE+1],two[MAXSIZE+1],three[MAXSIZE+1],four[MAXSIZE+1];
	int i,ii,rem;
	makezero(z)
	makezero(S1a)
	makezero(S1b)
	for ( i = 1; i <= STEPS; i++ ) {
		makezero(one)
		one[0] = 1;
		ii = 2*i-1;
		divide(one,ii)
		divide(one,ii)
		divide(one,ii)
		divide(one,ii)
		divide(one,ii)
		makezero(two)
		two[0] = 1;
		ii = 2*i;
		divide(two,ii)
		divide(two,ii)
		divide(two,ii)
		divide(two,ii)
		divide(two,ii)
		sub(one,two)
		makezero(three)
		three[0] = 1;
		divide(three,ii)
		add(S1a,three)
		makezero(three)
		three[0] = 1;
		ii = 2*i-1;
		divide(three,ii)
		add(S1a,three)
		makezero(four)
		four[0] = 1;
		divide(four,i)
		add(S1b,four)
		sub2(four,S1a,S1b)
		mult(four,one)
		add(z,four)
		makezero(one)
		one[0] = 1;
		ii = 2*i-1;
		divide(one,ii)
		divide(one,ii)
		divide(one,ii)
		divide(one,ii)
		divide(one,ii)
		ii = 2*i;
		divide(one,ii)
		add(z,one)
		if ( i%100 == 0 ) {
			printf("z: ");
			prt2(z)
		}
	}
	printf("z: ");
	prt2(z)
	return(0);
}
#endif

