#include <stdio.h>
#include <math.h>
typedef unsigned int Uint;
#define N 300
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 byat( Liczba pi ) {
wstawU( pi, 1 ) ;
Uint n= 1 , d= 3 ;
Liczba a; wstawU( a, 1 ) ;
while ( 1 ) {
razyU( a, n ) ; n++;
if ( ! podzielU( a, a, d ) ) {
razyU( pi, 2 ) ;
return n;
d += 2 ;
plus( pi, a ) ; } }
int main( void ) {
Liczba a;
DP= 1 ;
if ( 0 ) {
Liczba 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 ) ;
} else {
pisz ( a, - 1 ) ;
}
DP= N;
silnia( a, 57 ) ;
pisz ( a, - 1 ) ;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+Cgp0eXBlZGVmIHVuc2lnbmVkIGludCBVaW50OwojZGVmaW5lIE4gMzAwClVpbnQgRFA9MTsKLy9SQURJWCA9PSAxMF5MT0cKI2RlZmluZSBMT0cgMQojZGVmaW5lIFJBRElYIDEwCnR5cGVkZWYgVWludCBMaWN6YmFbTisxXTsKIAp2b2lkIHBpc3ooIExpY3piYSBhLCBpbnQgY3RybCl7IFVpbnQgaTsKCWZvciggaT0xOyBpPERQICYmICFhW2ldOyBpKysgKSBwcmludGYoIiUqcyIsIExPRywiIik7CglwcmludGYoIiUqdSIsIExPRywgYVtpXSk7Cglmb3IoIGkrKzsgaTw9RFA7IGkrKyApIHByaW50ZigiJTAqdSIsIExPRywgYVtpXSk7CglwdXRjaGFyKCcuJyk7Cglmb3IoICAgIDsgaTw9TjsgaSsrICkgcHJpbnRmKCIlMCp1IiwgTE9HLCBhW2ldKTsgCglpZiggY3RybCA8IDAgKSBwdXRzKCIiKTt9CgkJCnZvaWQgcGx1cyggTGljemJhIGEsIExpY3piYSBiKXsgICAgICAgICAgICAgICAgICAvLyBhW106PWFbXStiW10KCWZvciggVWludCBjPTAsIGk9TjsgaT4wOyBpLS0gKXsKCQljICs9IGFbaV0rYltpXTsKCQlhW2ldID0gYyAlIFJBRElYOwoJCWMgLz0gUkFESVg7fX0KCnZvaWQgbWludXMoIExpY3piYSBhLCBMaWN6YmEgYiApIHsgICAgICAgICAgICAgICAvLyBhW106PWFbXS1iW10KCWZvciggVWludCBjPTAsIGk9TjsgaT4wOyBpLS0gKXsKCQljICs9IGJbaV07CgkJaWYoIGFbaV08YyApewoJCQlhW2ldID0gUkFESVggKyBhW2ldIC0gYzsgYz0xOyB9CgkJZWxzZSB7CgkJCWFbaV0gLT0gYzsgYz0wOyB9fX0KCnZvaWQgcmF6eVUoIExpY3piYSBhLCBVaW50IGIgKSB7ICAgICAgICAgICAgICAgICAvLyBhW106PWFbXSAqIGIKCWZvciggVWludCBjPTAsaT1OOyBpPjA7IGktLSApewoJCWMgKz0gYVtpXSpiOwoJCWFbaV09IGMgJSBSQURJWDsKCQljIC89IFJBRElYOyB9fQoKaW50IHBvZHppZWxVKCBMaWN6YmEgdywgTGljemJhIGEsIFVpbnQgYiApIHsgICAgIC8vIHdbXTo9YVtdIC8gYgoJVWludCB6PTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gd1tdICE9IDAKCWZvciggVWludCBjPTAsIGk9MTsgaTw9TjsgaSsrICkgewoJCWMgPSBjKlJBRElYK2FbaV07CgkJd1tpXT0gYy9iICUgUkFESVg7IGlmKCB3W2ldICkgej0xOwoJCWMgPSBjIC0gd1tpXSpiO30KCXJldHVybiB6O30KCnZvaWQgd3N0YXdVKCBMaWN6YmEgYSwgVWludCBiICkgeyAgICAgICAgICAgICAgICAvLyBhW106PSBiCglVaW50IGk7Cglmb3IoIGk9MDsgaTw9TjsgaSsrICkgYVtpXT0wOwoJaT1EUDsKCXdoaWxlKCBiICkgewoJCWFbaS0tXSA9IGIlUkFESVg7IGIgLz0gUkFESVg7IH19Cgp2b2lkIGF0ZyggTGljemJhIGEsIFVpbnQgeCApIHsgICAgICAgICAgICAgICAgICAvLyBhW106PSBhdGFuKCAxL3ggKQoJTGljemJhIHB4OwoJd3N0YXdVKCBweCwgMSApOyBwb2R6aWVsVSggcHgsIHB4LCB4ICk7Cgl3c3Rhd1UoIGEsICAwICk7IHBsdXMgICAgKCBhLCBweCApOwoJZm9yKCBVaW50IG49MTsgICA7IG4rKykgewoJCUxpY3piYSBiOwoJCXBvZHppZWxVKCBweCwgcHgsIHgqeCApOwoJCWlmKCAhIHBvZHppZWxVKCBiLCBweCwgMipuICsgMSApICkgCgkJCWJyZWFrOwoJCWlmKCBuICYgMSApIG1pbnVzKCBhLCBiICk7CgkJZWxzZSBwbHVzKCBhLCBiICk7fX0KCQp2b2lkIHNpbG5pYSggTGljemJhIGEsIFVpbnQgbiApeyAgICAgICAgICAgICAgICAgLy8gYVtdOj0gbiEKCXdzdGF3VSggYSwgMSApOwoJd2hpbGUoIG4+MSApCgkJcmF6eVUoIGEsIG4tLSApO30KCmludCBiYnAoIExpY3piYSBwaSApewoJd3N0YXdVKCBwaSwgMCApOwoJTGljemJhIGEsIGI7Cglmb3IoIFVpbnQgaz0wOyAgOyBrKysgKSB7CgkJd3N0YXdVKCBhLCA0ICk7IHBvZHppZWxVKCBhLCBhLCA4KmsgKyAxICk7CgkJd3N0YXdVKCBiLCAyICk7IHBvZHppZWxVKCBiLCBiLCA4KmsgKyA0ICk7IG1pbnVzKCBhLCBiICk7CgkJd3N0YXdVKCBiLCAxICk7IHBvZHppZWxVKCBiLCBiLCA4KmsgKyA1ICk7IG1pbnVzKCBhLCBiICk7CgkJd3N0YXdVKCBiLCAxICk7IHBvZHppZWxVKCBiLCBiLCA4KmsgKyA2ICk7IG1pbnVzKCBhLCBiICk7CgkJZm9yKCBpbnQgaT0xOyBpPD1rOyBpKysgKQoJCQlpZiggISBwb2R6aWVsVSggYSwgYSwgMTYgKSApCgkJCQlyZXR1cm4gazsKCQlwbHVzKCBwaSwgYSApOyB9fQoKaW50IGJ5YXQoIExpY3piYSBwaSApIHsKCXdzdGF3VSggcGksIDEgKTsKCVVpbnQgbj0xLCBkPTM7CglMaWN6YmEgYTsgd3N0YXdVKCBhLCAxICk7Cgl3aGlsZSggMSApIHsKCQlyYXp5VSggYSwgbiApOyBuKys7CgkJaWYoICEgcG9kemllbFUoIGEsIGEsIGQgKSApIHsKCQkJcmF6eVUoIHBpLCAyICk7CgkJCXJldHVybiBuOwoJCWQgKz0gMjsKCQlwbHVzKCBwaSwgYSApO319IAoKaW50IG1haW4odm9pZCkgewoJTGljemJhIGE7CglEUD0xOwoJaWYoIDAgKSB7CgkJTGljemJhIGI7CgkJYXRnICAoIGEsIDE4ICk7IAoJCXJhenlVKCBhLCAxMiApOwoJCWF0ZyAgKCBiLCA1NyApOwoJCXJhenlVKCBiLCAgOCApOwoJCXBsdXMgKCBhLCAgYiApOwoJCWF0ZyAgKCBiLDIzOSApOwoJCXJhenlVKCBiLCAgNSApOwoJCW1pbnVzKCBhLCAgYiApOwoJCXJhenlVKCBhLCAgNCApOwoJCXBpc3ogKCBhLCAtMSApOwoJfSBlbHNlIHsKCQlwcmludGYoIiVkXG4iLCBieWF0ICAoIGEgKSApOwoJCXBpc3ogKCBhLCAtMSApOwoJfQoJRFA9TjsKCXNpbG5pYShhLCA1NyApOwoJcGlzeiAoIGEsIC0xICk7CglyZXR1cm4gMDsKfQo=