#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
, "" ) ; 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 ) ;
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, pk ) ;
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 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+Cgp0eXBlZGVmIHVuc2lnbmVkIGludCBVaW50OwojZGVmaW5lIE4gNzgwMApVaW50IERQPTE7Ci8vUkFESVggPT0gMTBeTE9HCiNkZWZpbmUgTE9HIDEKI2RlZmluZSBSQURJWCAxMAp0eXBlZGVmIFVpbnQgTGljemJhW04rMV07CiAKdm9pZCBwaXN6KCBMaWN6YmEgYSwgaW50IGN0cmwpeyBVaW50IGk7Cglmb3IoIGk9MTsgaTxEUCAmJiAhYVtpXTsgaSsrICkgcHJpbnRmKCIlKnMiLCBMT0csIiIpOwoJcHJpbnRmKCIlKnUiLCBMT0csIGFbaV0pOwoJZm9yKCBpKys7IGk8PURQOyBpKysgKSBwcmludGYoIiUwKnUiLCBMT0csIGFbaV0pOwoJcHV0Y2hhcignLicpOwoJZm9yKCAgICA7IGk8PU47IGkrKyApIHByaW50ZigiJTAqdSIsIExPRywgYVtpXSk7IAoJaWYoIGN0cmwgPCAwICkgcHV0cygiIik7fQoJCQp2b2lkIHBsdXMoIExpY3piYSBhLCBMaWN6YmEgYil7ICAgICAgICAgICAgICAgICAgLy8gYVtdOj1hW10rYltdCglmb3IoIFVpbnQgYz0wLCBpPU47IGk+MDsgaS0tICl7CgkJYyArPSBhW2ldK2JbaV07CgkJYVtpXSA9IGMgJSBSQURJWDsKCQljIC89IFJBRElYO319Cgp2b2lkIG1pbnVzKCBMaWN6YmEgYSwgTGljemJhIGIgKSB7ICAgICAgICAgICAgICAgLy8gYVtdOj1hW10tYltdCglmb3IoIFVpbnQgYz0wLCBpPU47IGk+MDsgaS0tICl7CgkJYyArPSBiW2ldOwoJCWlmKCBhW2ldPGMgKXsKCQkJYVtpXSA9IFJBRElYICsgYVtpXSAtIGM7IGM9MTsgfQoJCWVsc2UgewoJCQlhW2ldIC09IGM7IGM9MDsgfX19Cgp2b2lkIHJhenlVKCBMaWN6YmEgYSwgVWludCBiICkgeyAgICAgICAgICAgICAgICAgLy8gYVtdOj1hW10gKiBiCglmb3IoIFVpbnQgYz0wLGk9TjsgaT4wOyBpLS0gKXsKCQljICs9IGFbaV0qYjsKCQlhW2ldPSBjICUgUkFESVg7CgkJYyAvPSBSQURJWDsgfX0KCmludCBwb2R6aWVsVSggTGljemJhIHcsIExpY3piYSBhLCBVaW50IGIgKSB7ICAgICAvLyB3W106PWFbXSAvIGIKCVVpbnQgej0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHdbXSAhPSAwCglmb3IoIFVpbnQgYz0wLCBpPTE7IGk8PU47IGkrKyApIHsKCQljID0gYypSQURJWCthW2ldOwoJCXdbaV09IGMvYiAlIFJBRElYOyBpZiggd1tpXSApIHo9MTsKCQljID0gYyAtIHdbaV0qYjt9CglyZXR1cm4gejt9Cgp2b2lkIHdzdGF3VSggTGljemJhIGEsIFVpbnQgYiApIHsgICAgICAgICAgICAgICAgLy8gYVtdOj0gYgoJVWludCBpOwoJZm9yKCBpPTA7IGk8PU47IGkrKyApIGFbaV09MDsKCWk9RFA7Cgl3aGlsZSggYiApIHsKCQlhW2ktLV0gPSBiJVJBRElYOyBiIC89IFJBRElYOyB9fQoKdm9pZCBhdGcoIExpY3piYSBhLCBVaW50IHggKSB7ICAgICAgICAgICAgICAgICAgLy8gYVtdOj0gYXRhbiggMS94ICkKCUxpY3piYSBweDsKCXdzdGF3VSggcHgsIDEgKTsgcG9kemllbFUoIHB4LCBweCwgeCApOwoJd3N0YXdVKCBhLCAgMCApOyBwbHVzICAgICggYSwgcHggKTsKCWZvciggVWludCBuPTE7ICAgOyBuKyspIHsKCQlMaWN6YmEgYjsKCQlwb2R6aWVsVSggcHgsIHB4LCB4KnggKTsKCQlpZiggISBwb2R6aWVsVSggYiwgcHgsIDIqbiArIDEgKSApIAoJCQlicmVhazsKCQlpZiggbiAmIDEgKSBtaW51cyggYSwgYiApOwoJCWVsc2UgcGx1cyggYSwgYiApO319CgkKdm9pZCBzaWxuaWEoIExpY3piYSBhLCBVaW50IG4gKXsgICAgICAgICAgICAgICAgIC8vIGFbXTo9IG4hCgl3c3Rhd1UoIGEsIDEgKTsKCXdoaWxlKCBuPjEgKQoJCXJhenlVKCBhLCBuLS0gKTt9Cgp2b2lkIGJicCggTGljemJhIHBpICl7Cgl3c3Rhd1UoIHBpLCAwICk7CglVaW50IGtwPSAxOwoJTGljemJhIGEsIGI7Cglmb3IoIFVpbnQgaz0wOyBrPDg7IGsrKyApIHsKCQl3c3RhdyggYSwgNCApOyBwb2R6aWVsVSggYSwgYSwgOCprICsgMSApOwoJCXdzdGF3KCBiLCAyICk7IHBvZHppZWxVKCBiLCBiLCA4KmsgKyA0ICk7IG1pbnVzKCBhLCBiICk7CgkJd3N0YXcoIGIsIDEgKTsgcG9kemllbFUoIGIsIGIsIDgqayArIDUgKTsgbWludXMoIGEsIGIgKTsKCQl3c3RhdyggYiwgMSApOyBwb2R6aWVsVSggYiwgYiwgOCprICsgNiApOyBtaW51cyggYSwgYiApOwoJCXBvZHppZWxVKCBhLCBhLCBwayApOwoJCXBsdXMoIHBpLCBhICk7CgkJa3AgKj0gMTY7IH19CgppbnQgbWFpbih2b2lkKSB7CglMaWN6YmEgYSwgYjsKCURQPTE7CglhdGcgICggYSwgMTggKTsgCglyYXp5VSggYSwgMTIgKTsKCWF0ZyAgKCBiLCA1NyApOwoJcmF6eVUoIGIsICA4ICk7CglwbHVzICggYSwgIGIgKTsKCWF0ZyAgKCBiLDIzOSApOwoJcmF6eVUoIGIsICA1ICk7CgltaW51cyggYSwgIGIgKTsKCXJhenlVKCBhLCAgNCApOwoJcGlzeiAoIGEsIC0xICk7CiAKCWJicCAgKCBhICAgICApOwoJcGlzeiAoIGEsIC0xICk7CgkKCURQPTgwOwoJc2lsbmlhKGEsIDU3ICk7CglwaXN6ICggYSwgLTEgKTsKCXJldHVybiAwOwp9Cg==