#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-- );}
void 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;
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 );
*/
bbp ( a );
pisz ( a, -1 );
DP=80;
silnia(a, 57 );
pisz ( a, -1 );
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+Cgp0eXBlZGVmIHVuc2lnbmVkIGludCBVaW50OwojZGVmaW5lIE4gNzgKVWludCBEUD0xOwovL1JBRElYID09IDEwXkxPRwojZGVmaW5lIExPRyAxCiNkZWZpbmUgUkFESVggMTAKdHlwZWRlZiBVaW50IExpY3piYVtOKzFdOwogCnZvaWQgcGlzeiggTGljemJhIGEsIGludCBjdHJsKXsgVWludCBpOwoJZm9yKCBpPTE7IGk8RFAgJiYgIWFbaV07IGkrKyApIHByaW50ZigiJSpzIiwgTE9HLCIiKTsKCXByaW50ZigiJSp1IiwgTE9HLCBhW2ldKTsKCWZvciggaSsrOyBpPD1EUDsgaSsrICkgcHJpbnRmKCIlMCp1IiwgTE9HLCBhW2ldKTsKCXB1dGNoYXIoJy4nKTsKCWZvciggICAgOyBpPD1OOyBpKysgKSBwcmludGYoIiUwKnUiLCBMT0csIGFbaV0pOyAKCWlmKCBjdHJsIDwgMCApIHB1dHMoIiIpO30KCQkKdm9pZCBwbHVzKCBMaWN6YmEgYSwgTGljemJhIGIpeyAgICAgICAgICAgICAgICAgIC8vIGFbXTo9YVtdK2JbXQoJZm9yKCBVaW50IGM9MCwgaT1OOyBpPjA7IGktLSApewoJCWMgKz0gYVtpXStiW2ldOwoJCWFbaV0gPSBjICUgUkFESVg7CgkJYyAvPSBSQURJWDt9fQoKdm9pZCBtaW51cyggTGljemJhIGEsIExpY3piYSBiICkgeyAgICAgICAgICAgICAgIC8vIGFbXTo9YVtdLWJbXQoJZm9yKCBVaW50IGM9MCwgaT1OOyBpPjA7IGktLSApewoJCWMgKz0gYltpXTsKCQlpZiggYVtpXTxjICl7CgkJCWFbaV0gPSBSQURJWCArIGFbaV0gLSBjOyBjPTE7IH0KCQllbHNlIHsKCQkJYVtpXSAtPSBjOyBjPTA7IH19fQoKdm9pZCByYXp5VSggTGljemJhIGEsIFVpbnQgYiApIHsgICAgICAgICAgICAgICAgIC8vIGFbXTo9YVtdICogYgoJZm9yKCBVaW50IGM9MCxpPU47IGk+MDsgaS0tICl7CgkJYyArPSBhW2ldKmI7CgkJYVtpXT0gYyAlIFJBRElYOwoJCWMgLz0gUkFESVg7IH19CgppbnQgcG9kemllbFUoIExpY3piYSB3LCBMaWN6YmEgYSwgVWludCBiICkgeyAgICAgLy8gd1tdOj1hW10gLyBiCglVaW50IHo9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB3W10gIT0gMAoJZm9yKCBVaW50IGM9MCwgaT0xOyBpPD1OOyBpKysgKSB7CgkJYyA9IGMqUkFESVgrYVtpXTsKCQl3W2ldPSBjL2IgJSBSQURJWDsgaWYoIHdbaV0gKSB6PTE7CgkJYyA9IGMgLSB3W2ldKmI7fQoJcmV0dXJuIHo7fQoKdm9pZCB3c3Rhd1UoIExpY3piYSBhLCBVaW50IGIgKSB7ICAgICAgICAgICAgICAgIC8vIGFbXTo9IGIKCVVpbnQgaTsKCWZvciggaT0wOyBpPD1OOyBpKysgKSBhW2ldPTA7CglpPURQOwoJd2hpbGUoIGIgKSB7CgkJYVtpLS1dID0gYiVSQURJWDsgYiAvPSBSQURJWDsgfX0KCnZvaWQgYXRnKCBMaWN6YmEgYSwgVWludCB4ICkgeyAgICAgICAgICAgICAgICAgIC8vIGFbXTo9IGF0YW4oIDEveCApCglMaWN6YmEgcHg7Cgl3c3Rhd1UoIHB4LCAxICk7IHBvZHppZWxVKCBweCwgcHgsIHggKTsKCXdzdGF3VSggYSwgIDAgKTsgcGx1cyAgICAoIGEsIHB4ICk7Cglmb3IoIFVpbnQgbj0xOyAgIDsgbisrKSB7CgkJTGljemJhIGI7CgkJcG9kemllbFUoIHB4LCBweCwgeCp4ICk7CgkJaWYoICEgcG9kemllbFUoIGIsIHB4LCAyKm4gKyAxICkgKSAKCQkJYnJlYWs7CgkJaWYoIG4gJiAxICkgbWludXMoIGEsIGIgKTsKCQllbHNlIHBsdXMoIGEsIGIgKTt9fQoJCnZvaWQgc2lsbmlhKCBMaWN6YmEgYSwgVWludCBuICl7ICAgICAgICAgICAgICAgICAvLyBhW106PSBuIQoJd3N0YXdVKCBhLCAxICk7Cgl3aGlsZSggbj4xICkKCQlyYXp5VSggYSwgbi0tICk7fQoKdm9pZCBiYnAoIExpY3piYSBwaSApewoJd3N0YXdVKCBwaSwgMCApOwoJTGljemJhIGEsIGI7Cglmb3IoIFVpbnQgaz0wOyAgOyBrKysgKSB7CgkJd3N0YXdVKCBhLCA0ICk7IHBvZHppZWxVKCBhLCBhLCA4KmsgKyAxICk7CgkJd3N0YXdVKCBiLCAyICk7IHBvZHppZWxVKCBiLCBiLCA4KmsgKyA0ICk7IG1pbnVzKCBhLCBiICk7CgkJd3N0YXdVKCBiLCAxICk7IHBvZHppZWxVKCBiLCBiLCA4KmsgKyA1ICk7IG1pbnVzKCBhLCBiICk7CgkJd3N0YXdVKCBiLCAxICk7IHBvZHppZWxVKCBiLCBiLCA4KmsgKyA2ICk7IG1pbnVzKCBhLCBiICk7CgkJZm9yKCBpbnQgaT0xOyBpPD1rOyBpKysgKQoJCQlpZiggISBwb2R6aWVsVSggYSwgYSwgMTYgKSApCgkJCQlyZXR1cm47CgkJcGx1cyggcGksIGEgKTsgfX0KCmludCBtYWluKHZvaWQpIHsKCUxpY3piYSBhOwoJRFA9MTsKLyoJCglMaXpiYSBiOwoJYXRnICAoIGEsIDE4ICk7IAoJcmF6eVUoIGEsIDEyICk7CglhdGcgICggYiwgNTcgKTsKCXJhenlVKCBiLCAgOCApOwoJcGx1cyAoIGEsICBiICk7CglhdGcgICggYiwyMzkgKTsKCXJhenlVKCBiLCAgNSApOwoJbWludXMoIGEsICBiICk7CglyYXp5VSggYSwgIDQgKTsKCXBpc3ogKCBhLCAtMSApOwoqLyAKCWJicCAgKCBhICAgICApOwoJcGlzeiAoIGEsIC0xICk7CgkKCURQPTgwOwoJc2lsbmlhKGEsIDU3ICk7CglwaXN6ICggYSwgLTEgKTsKCXJldHVybiAwOwp9Cg==