#include <stdio.h>
#include <math.h>
typedef unsigned int Uint;
#define N 78
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
, "" ) ; for ( i
++; i
<= DP
; i
++ ) printf ( "%0*u" , LOG
, a
[ i
] ) ; 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-- ) ; }
int bbp( Liczba pi ) {
wstawU( pi, 0 ) ;
Liczba a, b;
for ( Uint k= 0 ; ; k++ ) {
wstawU( a, 4 ) ; podzielU( a, a, 8 * k + 1 ) ;
wstawU( b, 2 ) ; podzielU( b, b, 8 * k + 4 ) ; minus( a, b ) ;
wstawU( b, 1 ) ; podzielU( b, b, 8 * k + 5 ) ; minus( a, b ) ;
wstawU( b, 1 ) ; podzielU( b, b, 8 * k + 6 ) ; minus( a, b ) ;
for ( int i= 1 ; i<= k; i++ )
if ( ! podzielU( a, a, 16 ) )
return k;
plus( pi, a ) ; } }
int main( void ) {
Liczba a;
DP= 1 ;
Lizba b;
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 ) ;
pisz ( a, - 1 ) ;
DP= N;
silnia( a, 57 ) ;
pisz ( a, - 1 ) ;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+Cgp0eXBlZGVmIHVuc2lnbmVkIGludCBVaW50OwojZGVmaW5lIE4gNzgKVWludCBEUD0xOwovL1JBRElYID09IDEwXkxPRwojZGVmaW5lIExPRyAxCiNkZWZpbmUgUkFESVggMTAKdHlwZWRlZiBVaW50IExpY3piYVtOKzFdOwogCnZvaWQgcGlzeiggTGljemJhIGEsIGludCBjdHJsKXsgVWludCBpOwoJZm9yKCBpPTE7IGk8RFAgJiYgIWFbaV07IGkrKyApIHByaW50ZigiJSpzIiwgTE9HLCIiKTsKCXByaW50ZigiJSp1IiwgTE9HLCBhW2ldKTsKCWZvciggaSsrOyBpPD1EUDsgaSsrICkgcHJpbnRmKCIlMCp1IiwgTE9HLCBhW2ldKTsKCXB1dGNoYXIoJy4nKTsKCWZvciggICAgOyBpPD1OOyBpKysgKSBwcmludGYoIiUwKnUiLCBMT0csIGFbaV0pOyAKCWlmKCBjdHJsIDwgMCApIHB1dHMoIiIpO30KCQkKdm9pZCBwbHVzKCBMaWN6YmEgYSwgTGljemJhIGIpeyAgICAgICAgICAgICAgICAgIC8vIGFbXTo9YVtdK2JbXQoJZm9yKCBVaW50IGM9MCwgaT1OOyBpPjA7IGktLSApewoJCWMgKz0gYVtpXStiW2ldOwoJCWFbaV0gPSBjICUgUkFESVg7CgkJYyAvPSBSQURJWDt9fQoKdm9pZCBtaW51cyggTGljemJhIGEsIExpY3piYSBiICkgeyAgICAgICAgICAgICAgIC8vIGFbXTo9YVtdLWJbXQoJZm9yKCBVaW50IGM9MCwgaT1OOyBpPjA7IGktLSApewoJCWMgKz0gYltpXTsKCQlpZiggYVtpXTxjICl7CgkJCWFbaV0gPSBSQURJWCArIGFbaV0gLSBjOyBjPTE7IH0KCQllbHNlIHsKCQkJYVtpXSAtPSBjOyBjPTA7IH19fQoKdm9pZCByYXp5VSggTGljemJhIGEsIFVpbnQgYiApIHsgICAgICAgICAgICAgICAgIC8vIGFbXTo9YVtdICogYgoJZm9yKCBVaW50IGM9MCxpPU47IGk+MDsgaS0tICl7CgkJYyArPSBhW2ldKmI7CgkJYVtpXT0gYyAlIFJBRElYOwoJCWMgLz0gUkFESVg7IH19CgppbnQgcG9kemllbFUoIExpY3piYSB3LCBMaWN6YmEgYSwgVWludCBiICkgeyAgICAgLy8gd1tdOj1hW10gLyBiCglVaW50IHo9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB3W10gIT0gMAoJZm9yKCBVaW50IGM9MCwgaT0xOyBpPD1OOyBpKysgKSB7CgkJYyA9IGMqUkFESVgrYVtpXTsKCQl3W2ldPSBjL2IgJSBSQURJWDsgaWYoIHdbaV0gKSB6PTE7CgkJYyA9IGMgLSB3W2ldKmI7fQoJcmV0dXJuIHo7fQoKdm9pZCB3c3Rhd1UoIExpY3piYSBhLCBVaW50IGIgKSB7ICAgICAgICAgICAgICAgIC8vIGFbXTo9IGIKCVVpbnQgaTsKCWZvciggaT0wOyBpPD1OOyBpKysgKSBhW2ldPTA7CglpPURQOwoJd2hpbGUoIGIgKSB7CgkJYVtpLS1dID0gYiVSQURJWDsgYiAvPSBSQURJWDsgfX0KCnZvaWQgYXRnKCBMaWN6YmEgYSwgVWludCB4ICkgeyAgICAgICAgICAgICAgICAgIC8vIGFbXTo9IGF0YW4oIDEveCApCglMaWN6YmEgcHg7Cgl3c3Rhd1UoIHB4LCAxICk7IHBvZHppZWxVKCBweCwgcHgsIHggKTsKCXdzdGF3VSggYSwgIDAgKTsgcGx1cyAgICAoIGEsIHB4ICk7Cglmb3IoIFVpbnQgbj0xOyAgIDsgbisrKSB7CgkJTGljemJhIGI7CgkJcG9kemllbFUoIHB4LCBweCwgeCp4ICk7CgkJaWYoICEgcG9kemllbFUoIGIsIHB4LCAyKm4gKyAxICkgKSAKCQkJYnJlYWs7CgkJaWYoIG4gJiAxICkgbWludXMoIGEsIGIgKTsKCQllbHNlIHBsdXMoIGEsIGIgKTt9fQoJCnZvaWQgc2lsbmlhKCBMaWN6YmEgYSwgVWludCBuICl7ICAgICAgICAgICAgICAgICAvLyBhW106PSBuIQoJd3N0YXdVKCBhLCAxICk7Cgl3aGlsZSggbj4xICkKCQlyYXp5VSggYSwgbi0tICk7fQoKaW50IGJicCggTGljemJhIHBpICl7Cgl3c3Rhd1UoIHBpLCAwICk7CglMaWN6YmEgYSwgYjsKCWZvciggVWludCBrPTA7ICA7IGsrKyApIHsKCQl3c3Rhd1UoIGEsIDQgKTsgcG9kemllbFUoIGEsIGEsIDgqayArIDEgKTsKCQl3c3Rhd1UoIGIsIDIgKTsgcG9kemllbFUoIGIsIGIsIDgqayArIDQgKTsgbWludXMoIGEsIGIgKTsKCQl3c3Rhd1UoIGIsIDEgKTsgcG9kemllbFUoIGIsIGIsIDgqayArIDUgKTsgbWludXMoIGEsIGIgKTsKCQl3c3Rhd1UoIGIsIDEgKTsgcG9kemllbFUoIGIsIGIsIDgqayArIDYgKTsgbWludXMoIGEsIGIgKTsKCQlmb3IoIGludCBpPTE7IGk8PWs7IGkrKyApCgkJCWlmKCAhIHBvZHppZWxVKCBhLCBhLCAxNiApICkKCQkJCXJldHVybiBrOwoJCXBsdXMoIHBpLCBhICk7IH19CgppbnQgbWFpbih2b2lkKSB7CglMaWN6YmEgYTsKCURQPTE7CgoJTGl6YmEgYjsKCWF0ZyAgKCBhLCAxOCApOyAKCXJhenlVKCBhLCAxMiApOwoJYXRnICAoIGIsIDU3ICk7CglyYXp5VSggYiwgIDggKTsKCXBsdXMgKCBhLCAgYiApOwoJYXRnICAoIGIsMjM5ICk7CglyYXp5VSggYiwgIDUgKTsKCW1pbnVzKCBhLCAgYiApOwoJcmF6eVUoIGEsICA0ICk7CglwaXN6ICggYSwgLTEgKTsKCglwcmludGYoIiVkXG4iLCBiYnAgICggYSApICk7CglwaXN6ICggYSwgLTEgKTsKCQoJRFA9TjsKCXNpbG5pYShhLCA1NyApOwoJcGlzeiAoIGEsIC0xICk7CglyZXR1cm4gMDsKfQo=