#include <stdio.h>
#include <math.h>

typedef unsigned int Uint;
#define N 7800
Uint DP=1;
//RADIX == 10^LOG
#define LOG 1
#define RADIX 10
typedef Uint Liczba[N+1];
 
void pisz( Liczba a, int ctrl){ Uint i;
	for( i=1; i<DP && !a[i]; i++ ) printf("%*s", LOG,"");
	printf("%*u", LOG, a[i]);
	for( i++; i<=DP; i++ ) printf("%0*u", LOG, a[i]);
	putchar('.');
	for(    ; i<=N; i++ ) printf("%0*u", LOG, a[i]); 
	if( ctrl < 0 ) puts("");}
		
void plus( Liczba a, Liczba b){                  // a[]:=a[]+b[]
	for( Uint c=0, i=N; i>0; i-- ){
		c += a[i]+b[i];
		a[i] = c % RADIX;
		c /= RADIX;}}

void minus( Liczba a, Liczba b ) {               // a[]:=a[]-b[]
	for( Uint c=0, i=N; i>0; i-- ){
		c += b[i];
		if( a[i]<c ){
			a[i] = RADIX + a[i] - c; c=1; }
		else {
			a[i] -= c; c=0; }}}

void razyU( Liczba a, Uint b ) {                 // a[]:=a[] * b
	for( Uint c=0,i=N; i>0; i-- ){
		c += a[i]*b;
		a[i]= c % RADIX;
		c /= RADIX; }}

int podzielU( Liczba w, Liczba a, Uint b ) {     // w[]:=a[] / b
	Uint z=0;                                // return w[] != 0
	for( Uint c=0, i=1; i<=N; i++ ) {
		c = c*RADIX+a[i];
		w[i]= c/b % RADIX; if( w[i] ) z=1;
		c = c - w[i]*b;}
	return z;}

void wstawU( Liczba a, Uint b ) {                // a[]:= b
	Uint i;
	for( i=0; i<=N; i++ ) a[i]=0;
	i=DP;
	while( b ) {
		a[i--] = b%RADIX; b /= RADIX; }}

void atg( Liczba a, Uint x ) {                  // a[]:= atan( 1/x )
	Liczba px;
	wstawU( px, 1 ); podzielU( px, px, x );
	wstawU( a,  0 ); plus    ( a, px );
	for( Uint n=1;   ; n++) {
		Liczba b;
		podzielU( px, px, x*x );
		if( ! podzielU( b, px, 2*n + 1 ) ) 
			break;
		if( n & 1 ) minus( a, b );
		else plus( a, b );}}
	
void silnia( Liczba a, Uint n ){                 // a[]:= n!
	wstawU( a, 1 );
	while( n>1 )
		razyU( a, n-- );}

void bbp( Liczba pi ){
	wstawU( pi, 0 );
	Uint kp= 1;
	Liczba a, b;
	for( Uint k=0; k<8; k++ ) {
		wstaw( a, 4 ); podzielU( a, a, 8*k + 1 );
		wstaw( b, 2 ); podzielU( b, b, 8*k + 4 ); minus( a, b );
		wstaw( b, 1 ); podzielU( b, b, 8*k + 5 ); minus( a, b );
		wstaw( b, 1 ); podzielU( b, b, 8*k + 6 ); minus( a, b );
		podzielU( a, a, kp );
		plus( pi, a );
		kp *= 16; }}

int main(void) {
	Liczba a, b;
	DP=1;
	atg  ( a, 18 ); 
	razyU( a, 12 );
	atg  ( b, 57 );
	razyU( b,  8 );
	plus ( a,  b );
	atg  ( b,239 );
	razyU( b,  5 );
	minus( a,  b );
	razyU( a,  4 );
	pisz ( a, -1 );
 
	bbp  ( a     );
	pisz ( a, -1 );
	
	DP=80;
	silnia(a, 57 );
	pisz ( a, -1 );
	return 0;
}
